用户控件和 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上下文打开被认为是不好的做法。相反,在需要时创建上下文的新实例。实际上,将上下文包装在 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 是一种不好的做法。在另一个问题中看这里