Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# 使用EF 4.1将一个父记录和多个子记录作为一个“插入”;“工作单位”;_C#_Entity Framework - Fatal编程技术网

C# 使用EF 4.1将一个父记录和多个子记录作为一个“插入”;“工作单位”;

C# 使用EF 4.1将一个父记录和多个子记录作为一个“插入”;“工作单位”;,c#,entity-framework,C#,Entity Framework,我正在练习代码第一组类,它们之间有父子关系 public class Parent { public int Id ( get; set; } public string Name { get; set; } public List<Child> Children { get; set; } public Parent() { Children = new List<Child>(); } } publi

我正在练习代码第一组类,它们之间有父子关系

public class Parent
{
    public int Id ( get; set; }
    public string Name { get; set; }
    public List<Child> Children { get; set; }

    public Parent()
    {
        Children = new List<Child>();
    }
}

public class Child()
{
    public int Id ( get; set; }
    public string Name { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }
}
这不是我想要的,所以我尝试将其添加到父对象和上下文对象中

var x = new MyContext();

var c1 = new Child { Name = "Alpha-Child" };
var c2 = new Child { Name = "Beta-Child" };

var p = new Parent {Name = "Alpha-Parent"};

p.Children.Add(c1);
p.Children.Add(c2);

x.Children.Add(c1);
x.Children.Add(c2);

x.Parents.Add(p);

x.SaveChanges();
这将两个子记录都放入数据库,但其中只有一个(第一个)与父记录关联

最后,但并非最不重要的一点是,我尝试在每次调用Parent.Add()之后调用SaveChanges()

但是,这打破了我对“工作单元”模式工作原理的理解。我“应该能够调用SaveChanges()一次,并进行所有更改,对吗?”


那么,我做错了什么呢?

下面的代码将以单次保存更改的方式保存。并且始终使用transactionscope以单批保存

public class Child 
{
  public int Id ( get; set; }
  public string Name { get; set; }
  public Parent Parent {set;get;}
}


var x = new MyContext();
var c1 = new Child { Name = "Alpha-Child" };
var c2 = new Child { Name = "Beta-Child" };

var p = new Parent {Name = "Alpha-Parent"};
c1.Parent = p;
c2.Parent = p;
x.Parents.Add(p);
x.SaveChanges();

我不知道为什么要从EntityBase继承,因为您提到要首先使用POCO代码进行测试。 无论如何,我成功地测试了以下代码

 class Program
    {
        static void Main(string[] args)
        {
            var x = new MyContext();

            var c1 = new Child { Name = "Alpha-Child" };
            var c2 = new Child { Name = "Beta-Child" };

            var p = new Parent { Name = "Alpha-Parent" };

            p.Children.Add(c1);
            p.Children.Add(c2);

            x.Parents.Add(p);

            x.SaveChanges(); 


            Console.Read();
        }
    }

   public class Parent 
   { 
        public Parent() 
        { 
            Children = new List<Child>(); 
        } 

       public int Id { get; set; }
        public string Name { get; set; } 
        public List<Child> Children { get; set; } 
    } 

    public class Child
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
        public DbSet<Parent> Parents { get; set; } 
        public DbSet<Child> Children { get; set; } 
    } 
类程序
{
静态void Main(字符串[]参数)
{
var x=新的MyContext();
var c1=新子项{Name=“Alpha Child”};
var c2=新子项{Name=“Beta-Child”};
var p=新的父项{Name=“Alpha-Parent”};
p、 添加(c1);
p、 增加(c2);
x、 添加(p);
x、 保存更改();
Console.Read();
}
}
公共类父类
{ 
公共家长()
{ 
Children=新列表();
} 
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表子项{get;set;}
} 
公营儿童
{ 
公共int Id{get;set;}
公共字符串名称{get;set;}
} 
公共类MyContext:DbContext
{ 
公共数据库集父项{get;set;}
公共DbSet子项{get;set;}
} 

EntityBase…一个剪切和粘贴的工件。我已经修复了我的示例。谢谢。这确实有效。但是,为什么我需要一个指向父级的链接?在常规POCO世界中,除非业务需求需要,否则我永远不会创建这种类型的关系。我总是会从基本实体开始遍历我的实体。我错过了吗我应该学习/牢记一些模式吗?不,你不需要在Chind.Parnet中为Parent添加属性。Children属性对于一对多关系就足够了。只是一个更新:要使Children表中的Parent FK成为必需的,我确实需要将链接从子表添加回父表,并使用注释将其标记为必需。但是,我可以将属性设置为私有,以便对类的用户隐藏该属性。
public class Child 
{
  public int Id ( get; set; }
  public string Name { get; set; }
  public Parent Parent {set;get;}
}


var x = new MyContext();
var c1 = new Child { Name = "Alpha-Child" };
var c2 = new Child { Name = "Beta-Child" };

var p = new Parent {Name = "Alpha-Parent"};
c1.Parent = p;
c2.Parent = p;
x.Parents.Add(p);
x.SaveChanges();
 class Program
    {
        static void Main(string[] args)
        {
            var x = new MyContext();

            var c1 = new Child { Name = "Alpha-Child" };
            var c2 = new Child { Name = "Beta-Child" };

            var p = new Parent { Name = "Alpha-Parent" };

            p.Children.Add(c1);
            p.Children.Add(c2);

            x.Parents.Add(p);

            x.SaveChanges(); 


            Console.Read();
        }
    }

   public class Parent 
   { 
        public Parent() 
        { 
            Children = new List<Child>(); 
        } 

       public int Id { get; set; }
        public string Name { get; set; } 
        public List<Child> Children { get; set; } 
    } 

    public class Child
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
        public DbSet<Parent> Parents { get; set; } 
        public DbSet<Child> Children { get; set; } 
    }