EF6 Seed方法丢弃引用

时间:2014-06-04 15:21:01

标签: entity-framework entity-framework-6

我首先使用的是EF6代码,我正在尝试在种子方法中添加一些测试数据。我正在使用一个自引用的对象。引用是可选的,以便顶级元素具有null ParentOrgId。 OrgId是一个标识列,所以我没有为它设置ID。第一次运行update-database时,对象被正确添加,ParentOrgId正确。第二次以及我运行update-database的所有后续时间所有ParentOrgIds都变为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; }
    }

配置:

public OrgConfiguration()
    {
        HasKey<int>(o => o.OrgId);

        HasOptional<Org>(o => o.ParentOrg)
            .WithMany(o => o.Children)
            .HasForeignKey(o => o.ParentOrgId);
    }

种子方法:

        Org[] seedOrgs = new Org[4];
        Org o1 = new Org();
        o1.Name = "TEST";
        o1.Depth = 0;
        seedOrgs[0] = o1;

        Org o2 = new Org();
        o2.Name = "TESTC1";
        o2.Depth = 1;
        o2.ParentOrg = o1;

        seedOrgs[1] = o2;

        Org o3 = new Org();
        o3.Name = "TESTC11";
        o3.Depth = 2;
        o3.ParentOrg = o2;
        seedOrgs[2] = o3;

        Org o4 = new Org();
        o4.Name = "TESTC2";
        o4.Depth = 1;
        o4.ParentOrg = o1;
        seedOrgs[3] = o4;

        context.Orgs.AddOrUpdate(o => o.Name, seedOrgs);

2 个答案:

答案 0 :(得分:1)

这可能是由于AddOrUpdate中的known bug

  

执行匹配实体的查询,如果存在,将返回新的实体实例。 (...)传递给AddOrUpdate方法的实例基本上被丢弃了。但是,应用程序代码仍在使用此丢弃的实例,这会导致此错误中出现的意外行为。

我会试试这个:

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);

答案 1 :(得分:0)

如果使用Seed()方法插入数据,最好让包含Seed()方法的类(通常为Configuration)继承自:

DropCreateDatabaseAlways<YourContext>

这样,每次启动程序时都会删除并再次创建数据库,这样每次都会获得新的新数据。