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; }
}