Entity framework EF6种子方法删除引用

Entity framework EF6种子方法删除引用,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我首先使用EF6代码,并尝试在seed方法中添加一些测试数据。我使用的对象是自引用的。引用是可选的,因此顶级元素的ParentOrgId为空。OrgId是一个标识列,所以我不为它设置ID。第一次运行更新数据库时,对象被正确添加,并且ParentOrgId是正确的。第二次和以后运行更新数据库时,所有parentorgid都会更改为null。我必须删除数据库中的条目,然后它会在第一次工作,然后在第二次变为null时工作。知道为什么要删除参考资料吗 对象: public class Org {

我首先使用EF6代码,并尝试在seed方法中添加一些测试数据。我使用的对象是自引用的。引用是可选的,因此顶级元素的ParentOrgId为空。OrgId是一个标识列,所以我不为它设置ID。第一次运行更新数据库时,对象被正确添加,并且ParentOrgId是正确的。第二次和以后运行更新数据库时,所有parentorgid都会更改为null。我必须删除数据库中的条目,然后它会在第一次工作,然后在第二次变为null时工作。知道为什么要删除参考资料吗

对象:

public class Org
    {
        public int OrgId { get; set; }
        public int? ParentOrgId { get; set; }
        public string Name { get; set; }
        public int Depth { get; set; }

        public virtual Org ParentOrg { get; set; }
        public virtual ICollection<Org> Children { get; set; }
    }

如果使用Seed()方法插入数据,最好让包含Seed()方法(通常是配置)的类从以下继承:

DropCreateDatabaseAlways<YourContext>
DropCreateDatabaseAlways
这样,每次启动程序时,您的数据库都会被删除并再次创建,因此每次都会获得新的需要的数据

这可能是由于在
添加或更新中出现以下错误:

对匹配的实体执行查询,如果存在,将返回新的实体实例。(…)传递到AddOrUpdate方法的实例实际上已被丢弃。但是,应用程序代码仍然在使用这个被丢弃的实例,这导致了在这个bug中看到的意外行为

我想试试这个:

Org o1 = new Org();
o1.Name = "TEST";
o1.Depth = 0;
context.Orgs.AddOrUpdate(o => o.Name, o1);
o1 = context.Orgs.Local.Single(o => o.Name == o1.Name);
然后不要将
o1
添加到
seedOrgs
并执行其余代码

顺便说一下,你也可以

context.Orgs.AddOrUpdate(o => o.Name, o2, o3, o4);

我想你可能发现了这个bug,但即使有了这些更改,第二个更新数据库中的引用仍然会被删除。并非所有数据都是使用seed方法输入的。
Org o1 = new Org();
o1.Name = "TEST";
o1.Depth = 0;
context.Orgs.AddOrUpdate(o => o.Name, o1);
o1 = context.Orgs.Local.Single(o => o.Name == o1.Name);
context.Orgs.AddOrUpdate(o => o.Name, o2, o3, o4);