C# 实体框架5添加具有其他外键关系的实体和子实体
我首先使用实体框架(EF)5代码 我有一个自引用对象,我们称之为C# 实体框架5添加具有其他外键关系的实体和子实体,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我首先使用实体框架(EF)5代码 我有一个自引用对象,我们称之为Demo: public class Demo { public int Id; public string Name; public Demo Parent; public ICollection<Demo> Children; public Item Item; } 是的,这也是自我参照,但这不重要。数据库现在有一个基于项Id的外键,该项Id是通过数据库迁移添加到Demo
Demo
:
public class Demo
{
public int Id;
public string Name;
public Demo Parent;
public ICollection<Demo> Children;
public Item Item;
}
是的,这也是自我参照,但这不重要。数据库现在有一个基于项Id
的外键,该项Id是通过数据库迁移添加到Demo
表中的。数据库预先填充了一组项
记录(这是一组有限的记录)
我的上下文已将其很好地映射到数据库,我正在对新记录进行大量数据插入。还有一段代码用数据填充对象。这是通过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();
}
public void ImportDemo(IEnumerable演示)
{
var context=this.UnitOfWork.MyApplicationContext;
foreach(演示中的var演示)
{
this.DataSet.Add(演示);
context.Entry(demo.State=EntityState.Added;
}
//注意:应为空db。
SaveChanges();
}
我的DbModelBuilder具有以下功能:
modelBuilder.Entity<Demo>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Children);
modelBuilder.Entity<Item>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Children);
modelBuilder.Entity()
.has可选(p=>p.Parent)
.有许多(p=>p.儿童);
modelBuilder.Entity()
.has可选(p=>p.Parent)
.有许多(p=>p.儿童);
我可以成功导入演示
实体和子演示
实体,但是每个子演示
实体都在数据库中创建一个新的项
,而不仅仅是链接到现有的项
。父级Demo
实体没有项
记录,它们为空
如何确保子
演示
实体链接到现有的项目
记录,而不是创建新记录 整个结构设置在业务层中,并映射()到所讨论的模型
Item
对象位于DbContext.IDbSet.Local
集合中,但是需要使用本地集合中的Item
对象重置模型中的虚拟项,如下所示
public void ImportDemo(IEnumerable<Demo> demos)
{
foreach (var demo in demos)
{
foreach (var child in demo.Children)
{
child.Item =
dbContext.Items.Local.First(p => p.Id == child.Item.Id)
}
dbContext.Set<Demo>.Add(demo);
}
dbContext.SaveChanges();
}
public void ImportDemo(IEnumerable演示)
{
foreach(演示中的var演示)
{
foreach(demo.Children中的变量child)
{
子项。项=
dbContext.Items.Local.First(p=>p.Id==child.Item.Id)
}
dbContext.Set.Add(演示);
}
dbContext.SaveChanges();
}
我尝试使用了Attach()
,但它的行为与我在MSDN文档中预期的不一样。我认为您在这里显示的代码没有问题,我认为,一旦您在导入函数的参数中显示实例化演示对象的代码,问题就会出现。由于@ArturoMartinez的评论,我能够正确地关注问题,并添加了一个答案。
public void ImportDemo(IEnumerable<Demo> demos)
{
foreach (var demo in demos)
{
foreach (var child in demo.Children)
{
child.Item =
dbContext.Items.Local.First(p => p.Id == child.Item.Id)
}
dbContext.Set<Demo>.Add(demo);
}
dbContext.SaveChanges();
}