实体框架6.1.3外键在自引用表上设置为null

时间:2016-05-24 20:51:54

标签: c# arrays sql-server entity-framework foreign-keys

我在使用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(此字段需要为空以建立根),从而破坏关系!

我已经尝试撤消项目传递的顺序但是没有用。我唯一的解决方法是节省每个循环,但性能明显恶化,阵列越大。

我找不到其他人遇到此问题。也许我对实体框架的理解存在一些基本缺失。

有人可以帮忙吗?它让我发疯了!

0 个答案:

没有答案