我正在使用实体框架 (EF) 5 Code First。
我有一个自引用对象,我们称之为Demo
:
public class Demo
{
public int Id;
public string Name;
public Demo Parent;
public ICollection<Demo> Children;
public Item Item;
}
这引用了另一个对象,Item
:
public class Item
{
public int Id;
public string Name;
public Item Parent;
public ICollection<Item> Children;
}
是的,它也是自引用的,但这无关紧要。数据库现在有一个外键,该外键基于通过数据库迁移Item_Id
添加到表中的 。Demo
数据库预先填充了一组Item
记录(这是一个有限的集合)。
我的上下文已经很好地将其映射到数据库,并且我正在对新记录进行大量数据插入。还有一段代码用数据填充对象。这是通过 EF 的实际导入:
public void ImportDemo(IEnumerable<Demo> demos)
{
var context = this.UnitOfWork.MyApplicationContext;
foreach (var demo in demos)
{
this.DataSet.Add(demo);
context.Entry(demo).State = EntityState.Added;
}
// NOTE: expecting an empty db.
context.SaveChanges();
}
我的 DbModelBuilder 具有以下内容:
modelBuilder.Entity<Demo>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Children);
modelBuilder.Entity<Item>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Children);
我可以成功导入Demo
实体和Demo
子实体,但是每个子实体都在数据库Demo
中创建一个新实体Item
,而不仅仅是链接到现有的Item
. 父Demo
实体没有Item
记录,它们为空。
如何确保Demo
子实体链接到现有Item
记录而不是创建新记录?