Не сохраняются данные в БД SQLite (C#)

Проблема возникает при попытке добавления новой/редактирования существующей записи в базе данных. При подтверждении транзакции transaction.Commit() и последующим сохранением изменений db.SaveChanges() вылетает ошибка "An error occurred while starting a transaction on the provider connection. data base is locked". Сказали, что можно обойтись и без db.SaveChanges(), подтверждая транзакцию, ошибка не вылетает, но данные не сохраняются.

public partial class PageIngCreate : Page
{
    private AppContext db;

    public PageIngCreate(string id)
    {
        InitializeComponent();
        db = new AppContext();

        LoadMeasures();

        if (id != "null")
        {
            LoadIngredient(Int32.Parse(id));
        }
    }

    private void LoadMeasures()
    {
        using (var con = new SQLiteConnection("Data Source=DBConfectioryFabric.db; Version=3;"))
        {
            con.Open();
            using (var cmd = new SQLiteCommand("Select * from Measures", con))
            {
                using (SQLiteDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string measureName = reader.GetString(reader.GetOrdinal("MeasureName"));
                        CmbMeasure.Items.Add(measureName);
                    }
                    reader.Close();
                }
            }
        }
    }

    private void LoadIngredient(int id)
    {
        using (var con = new SQLiteConnection("Data Source=DBConfectioryFabric.db; Version=3;"))
        {
            con.Open();
            using (var cmd = new SQLiteCommand("Select Ingredients.ID, Ingredients.IngredientName, Measures.MeasureName" +
                                                " From Ingredients" +
                                                " Left Join Measures On Ingredients.Measure = Measures.ID" +
                                                " Where Ingredients.ID = @id", con))
            {
                cmd.Parameters.AddWithValue("@id", id);
                using (SQLiteDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        TxtID.Text = reader.GetInt32(reader.GetOrdinal("ID")).ToString();
                        TxtName.Text = reader.GetString(reader.GetOrdinal("IngredientName"));
                        CmbMeasure.Text = reader.GetString(reader.GetOrdinal("MeasureName"));
                    }
                    reader.Close();    
                }
            }
        }
    }

    private void BtnSave_Click(object sender, RoutedEventArgs e)
    {
        using (var con = new SQLiteConnection("Data Source=DBConfectioryFabric.db; Version=3;"))
        {
            con.Open();
            using (var transaction = con.BeginTransaction())
            {
                try
                {
                    int measureId = GetMeasureId(con, CmbMeasure.Text);

                    if (string.IsNullOrWhiteSpace(TxtID.Text))
                    {
                        Ingredient ingredient = new Ingredient(TxtName.Text, measureId);
                        db.Ingredients.Add(ingredient);
                        MessageBox.Show("Ингредиент успешно добавлен!");
                    }
                    else
                    {
                        Ingredient ingredient = db.Ingredients.Find(Int32.Parse(TxtID.Text));
                        if (ingredient != null)
                        {
                            ingredient.IngredientName = TxtName.Text;
                            ingredient.Measure = measureId;
                            MessageBox.Show("Ингредиент успешно изменен!");
                        }
                    }

                    //db.SaveChanges();
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    MessageBox.Show("Ошибка при сохранении данных: " + ex.Message);
                }
            }
        }
    }

    private int GetMeasureId(SQLiteConnection con, string measureName)
    {
        using (var cmd = new SQLiteCommand("Select ID From Measures Where MeasureName = @SelectedName", con))
        {
            cmd.Parameters.AddWithValue("@SelectedName", measureName);
            return Convert.ToInt32(cmd.ExecuteScalar());
        }
    }
}

Ответы (1 шт):

Автор решения: Сергей Кислицын

AlexanderSt помог найти решение. Достаточно было поменять SaveChanges и tranaction.Commit() местами..

→ Ссылка