我有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其他地方的这些导航属性,我可以简单地按.Include("MyOtherTable")
我需要的所有内容进行切换(因为当上下文处理时导航属性停止工作)
答案 0 :(得分:0)
在这种情况下我只会使用一个上下文。您必须注意从另一个线程访问上下文 - 它可能导致事务错误(“不允许新事务,因为在会话中运行其他线程”)
如果将DataGridView与EF Context中的DataSource一起使用,您只需重新加载实体即可。 我在我的上下文中写了扩展方法:
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);
}
}
它比entry.Reload();
快得多F.E:
List<MyEntities> items = new List<MyEntities>();
foreach(DataGridViewRow row in dataGridView1.SelectedRows)
{
items.Add((MyEntities)row.DataBoundItem);
}
context.Refresh(items);