我首先使用的是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);
答案 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>
这样,每次启动程序时都会删除并再次创建数据库,这样每次都会获得新的新数据。