Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架5添加具有其他外键关系的实体和子实体_C#_Entity Framework_Entity Framework 5 - Fatal编程技术网

C# 实体框架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

我首先使用实体框架(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
表中的。数据库预先填充了一组
记录(这是一组有限的记录)

我的上下文已将其很好地映射到数据库,我正在对新记录进行大量数据插入。还有一段代码用数据填充对象。这是通过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();
}