实体框架保存对集合的更改
本文关键字:集合 框架 保存 实体 | 更新日期: 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
让它们惰性加载。