VB.NET如何在winform

时间:2018-02-26 18:30:13

标签: vb.net winforms entity-framework

我有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")我需要的所有内容进行切换(因为当上下文处理时导航属性停止工作)

1 个答案:

答案 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);