gpt4 book ai didi

entity-framework - AsNoTracking 复制实体

转载 作者:行者123 更新时间:2023-12-04 04:21:25 25 4
gpt4 key购买 nike

抱歉我的英语不好 - 我在 WPF (.net 4.5) 应用程序中使用 EF 5 (Code First)。每个窗口都有自己的上下文。

我有一个这样的模型(为简洁起见省略了代码):

public class Car
{
public string Model { get; set; }
public int BrandId { get; set; }
public virtual Brand Brand { get; set; }
}

我使用组合框允许用户关联 BrandCar .问题是,每次我保存 Car ,一个新的,重复的Brand也得救了。发生这种情况是因为我用 AsNoTracking() 加载了组合框.

现在,我用 AsNoTracking() 加载组合框因为我在 Brand 上加载更改时遇到问题在其他 DbContext 实例中创建的表(使用 myContext.Set<Brand>().Load() )。

所以我的问题是,如何解决这个问题?如果有另一种方法可以强制重新加载集合(不使用 AsNoTracking ),那就太好了。更好的是能够通知 EF AsNoTracking加载的实体不是新的。

编辑 1:@标记:谢谢,将实体附加到上下文就可以了。但是我使用了一个通用基类来进行验证并保存我所有表单的数据,因此手动附加实体不是很实用......根据你的建议我最终这样做了,在添加 Car 实体之后并在保存它之前:

var entities = (((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added));

foreach (var item in entities)
{
if ((item.Entity as EntityBase).Id > 0)
{
item.ObjectStateManager.ChangeObjectState(item.Entity, EntityState.Unchanged);
}
}

(我所有的实体都继承自 EntityBase,我所有的 key 都是数据库生成的)。这很好用,但我想听取第二意见...这样好还是有更简单的方法?

最佳答案

发生的事情是您的上下文不知道附加到汽车的品牌,因此它正在创建一个新品牌来匹配您的外键。在保存之前,您应该将品牌附加到上下文中:

context.Brands.Attach(brand);

您可以通过单独重新加载来在保存之前重新加载单个品牌:

db.Entry(brand).Reload();

如果您不想在保存汽车时实际保留对 Brand 的任何更改,您可以告知上下文 Brand 未更改,并阻止更新。

context.Entry(brand).State = EntityState.Unchanged;

关于entity-framework - AsNoTracking 复制实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12185139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com