我有一个DataDridview
充满了我的DbContext
查询的对象。我在这个表单中显示了一些关于我的对象的基本信息。
我想在每次在DataDridview
中选择不同的对象时从BD查询最新的信息。我也希望能够修改这些对象。
我已经能够做到这一点。例如,要修改对象,我将执行以下步骤:
- 创建一个新的DbContext
使用.Selectedrows(0).DatabountItem
从我的Datagridview中获取对象
- 使用该对象的id我将使用我的新DbContext
查询数据库中的(最近的)记录
- 将旧对象(已修改)属性逐个分配给新对象
-.SaveChanges
在我新的Dbcontext
上。
但是还有更好的方法,对吗? :/
如果我理解正确,通过这样做,我最终得到了大量未使用的Dbcontext,我怀疑这是最好的做法。
但每当我.Dispose
我的上下文,所有EF导航属性都被打破,我得到异常突然出现...所以理想的解决方案似乎只是,刷新我将用于整个表单的独特DbContext中的数据。但它甚至可能吗?
也许解决方案很明显,但我看不到它。
如果我不清楚,请告诉我,我会尽力重新制定。
任何帮助将不胜感激,谢谢!
**编辑**
最后,这是最适合我的解决方案:
我为每个逻辑操作创建一个新的DbContext,然后立即.Dispose
它...
除了我在datagridview中显示有关特定行的信息时。
相反,我创建了一个新的Context并将其保持打开状态。只有当.Dispose
事件发生时我才会datagridview.SelectionChanged
。
不立即处理此上下文的原因是:如果用户保存他的更改,但同时其他人也保存了同一记录的更改,(未同步)上下文将遇到并发问题..我可以让用户知道它,而不是覆盖那一行,这将是坏事。
如果我需要来自EF其他地方的这些导航属性,我可以简单地通过qazxsw poi急切加载我需要的一切。(因为导航属性在上下文处理时停止工作)
在这种情况下,我只使用一个上下文。您必须注意从另一个线程访问上下文 - 它可能导致事务错误(“不允许新事务,因为在会话中运行其他线程”)
如果将DataGridView与EF Context中的DataSource一起使用,您只需重新加载实体即可。我在我的上下文中写了扩展方法:
.Include("MyOtherTable")
它比entry.Reload();
F.E:
public partial class MyContext : testEntities1
{
public void Refresh(IEnumerable entities)
{
var ctx = ((IObjectContextAdapter)this).ObjectContext;
ctx.Refresh(System.Data.Entity.Core.Objects.RefreshMode.StoreWins, entities);
}
}