实体框架保存对集合的更改

本文关键字:集合 框架 保存 实体 | 更新日期: 2023-09-27 18:29:48

我有这段代码

public int Update(Item item)
{
    using (var ctx = new DataConext())
    {
        ctx.Entry(item).State = EntityState.Modified;
        return ctx.SaveChanges();
    }
}
Class Item
{
 public string Name {get;set;}
 public ICollection<Foobar> Foos {get;set;}
}
Class Foobar
{
 public string FirstName {get;set;}
 public string LastName {get;set;}
}

比方说:

item.Foos.ElementAt(0).FirstName = "edited name"

SaveChanged()已执行,但我在数据库中有"旧"值,而不是"编辑的名称"。。。

我可以在调试中看到Local中的正确更改。

实体框架保存对集合的更改

看起来您的对象来自与您现在使用的上下文不同的上下文。在这种情况下,你不能用泛型来做这件事,因为你需要在Foobar集合中做foreEach,并单独更改每个项目的状态。

这里有一个断开连接的实体图,因此实体断开连接,更改跟踪丢失。您只设置主实体的状态,因此EF假设其他一切都没有改变。

Jullie Lerman的书是了解如何运作的一个很好的来源

我要做的是,我会为简单的实体保留这个方法,但使其成为虚拟的,这样你就可以继承这个repo来创建特定的实体repo,并用更具体的实现覆盖更新方法,该实现适合于像你的例子中的实体。

有一篇文章帮助我设计了这样一个回购:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application.

您正在一个上下文中加载对象并保存在另一个上下文。移除using (var ctx = new DataConext())块,并搜索一种方法来访问加载项目的上下文,然后调用SaveChanges();。另一种方法是将上下文传递给方法,如public int Update(Item item, DbContext context),并保存更改。

Class Item
{
    public string Name {get;set;}
    public ICollection<Foobar> Foos {get;set;}
}

您需要Include将Foo包含到对象管理器中。现在,它正在急切地加载。无论你在哪里装载物品,你都必须将其包括在内。

您应该使用include,或者您可以使用virtual让它们惰性加载。