VB.NET如何在winform中“刷新”数据DbContext

问题描述 投票:0回答:1

我有一个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急切加载我需要的一切。(因为导航属性在上下文处理时停止工作)

vb.net winforms entity-framework
1个回答
0
投票

在这种情况下,我只使用一个上下文。您必须注意从另一个线程访问上下文 - 它可能导致事务错误(“不允许新事务,因为在会话中运行其他线程”)

如果将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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.