我在使用Entity Framework 6.1.3的代码优先模型中使用通用存储库,并且一直运行良好......直到现在。我想同时更新许多记录并拥有以下代码:
public T[] UpdateMany<T>(params T[] entities) where T : class
{
foreach (T item in entities)
{
var entry = _context.Entry(item);
_context.Set<T>().Attach(item);
entry.State = EntityState.Modified;
}
return entities;
}
一旦运行,我会相应地保存更改,因此只使用我的更新一次点击数据库。到目前为止很好,但后来我传递了一个包含自引用外键的类型的实体数组。因此,Foo
包含ParentId
,它引用同一实体中的主键(Id
)。
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentId { get; set; }
public string Node { get; set; }
public bool IsActive{ get; set; }
public virtual Foo Parent { get; set; }
public virtual ICollection<Foo> Children{ get; set; }
}
我传入的数组将包含相互引用的项目。对于少数isActive
,我可能希望将Foo
字段设置为true。类似的东西:
[
{ id: 1, parentId: null, name: "foo 1", isActive: true},
{ id: 2, parentId: 1, name: "foo 2", isActive: true},
{ id: 3, parentId: 2, name: "foo 3", isActive: true},
{ id: 4, parentId: 2, name: "foo 4", isActive: true},
]
当第一个项目命中时,问题就出现了。
var entry = _context.Entry(item);
然后,数组中的其余项目将parentId
设置为null(此字段需要为空以建立根),从而破坏关系!
我已经尝试撤消项目传递的顺序但是没有用。我唯一的解决方法是节省每个循环,但性能明显恶化,阵列越大。
我找不到其他人遇到此问题。也许我对实体框架的理解存在一些基本缺失。
有人可以帮忙吗?它让我发疯了!