用户控件和 EF 上下文释放

本文关键字:上下文 释放 EF 控件 用户 | 更新日期: 2023-09-27 18:32:57

我有一个用户控件,我正在使用我的EF上下文将数据从数据库加载到dataGridView,以使用户能够进行一些更改:

    public partial class MyUserControl: UserControl
    {
        MyEntities context;
        public ViewMasterData()
        {
            InitializeComponent();
            createComboBoxTable();
        }
        private void MyUserControl_Load(object sender, EventArgs e)
        {
            context = new MyEntities();
        }
    // Other methods to fill the dataGridView and Save the data back to the DB
        private void SaveChanges()
        {
            context.SaveChanges();                
        }
    }

我想在离开用户控件(即导航到另一个用户控件)时处理上下文,但似乎调用上下文。UserControl的Dispose()方法(在代码生成的代码中)不起作用,因为它仅在我关闭整个WinForm时才被调用。我无法使用"using",因为我需要保持上下文打开以执行更改然后保存。

问题是:当我离开用户控件时,如何正确释放上下文?谢谢!

用户控件和 EF 上下文释放

我认为保持EF上下文打开被认为是不好的做法。相反,在需要时创建上下文的新实例。实际上,将上下文包装在 using 语句中将通过垃圾整理自动释放它。

public partial class MyUserControl: UserControl
{
    // MyEntities context; i dont need this
    public ViewMasterData()
    {
        InitializeComponent();
        // createComboBoxTable();
    }
    private void MyUserControl_Load(object sender, EventArgs e)
    {
        using (var context = new MyEntitiesContext())
        {
            createComboBoxTable(context.MyEntities.ToList());
        }
    }
    private void SaveNewMyEntity(MyEntity newEntity)
    {
        using (var context = new MyEntitiesContext())
        {
            // some logic here to check for uniqueness etc
            context.MyEntities.Add(newEntity);
            context.SaveChanges(); 
        }
    }
    private void UpdateExistingMyEntity(MyEntity updatedEntity)
    {
        using (var context = new MyEntitiesContext())
        {
            context.Entry(updatedEntity).State = EntityState.Modified;
            context.SaveChanges(); 
        }
    }
}

更新:

我同意最好一次添加多个实体,您只需要一个 foreach 循环,也许还有一个指示 MyEntity 实例是否已更新的小布尔属性。像这样的东西是一个可能的解决方案:

private void UpdateExistingMyEntity(IEnumerable<MyEntity> updatedEntities)
{
    using (var context = new MyEntitiesContext())
    {
        foreach(MyEntity e in updatedEntities)
            context.Entry(e).State = EntityState.Modified;
        context.SaveChanges(); 
    }
}

当用户单击"保存"按钮...

private void saveBtn_Click(object sender, RoutedEventArgs e)
{
    IEnumerable<MyEntity> updatedEntities = myGridData.Where(o => o.HasBeenUpdated == true);
    UpdateExistingMyEntity(updatedEntities);
    foreach(MyEntity e in updatedEntities)
        e.HasBeenUpdated = false;
}

直接在用户控件中使用 EF 是一种不好的做法。在另一个问题中看这里