我有以下型号。
class Parent
{
int ParentId (identity column) { get; set; }
string ParentName { get; set; }
virtual ICollection<Child> Children { get; set; }
}
class Child
{
int ChildId (identity column) { get; set; }
string ChildName { get; set; }
int ParentID { get ; set; } //foreign key to Parent(ParentID)
}
如何在单个事务中向父母和子女插入几行?基本上我想获得在父级上生成的标识(比如我在父级中插入一行)并插入具有该值的子行? 如何使用Code First实现这一目标?
答案 0 :(得分:41)
您不应该担心Parent
的ID会在插入Child
行时获得什么值。这应该足够了:
var parent = new Parent
{
// fill other properties
Children = new List<Child>()
}
parent.Children.add(new Child { /*fill values */);
dbContext.Parents.Add(parent); // whatever your context is named
dbContext.SaveChanges();
对于记录,ID将在调用SaveChanges()
后分配,因此如果确实在插入Child
实体之前需要ID,则可以随时调用{{1两次。
同样,这不应该是必要的。
顺便说一句,我建议将外键属性从SaveChanges()
变为Child
导航属性,因此Parent
类看起来像:
Child
通过这种方式,您可以直接访问Child的父级,而无需自己从数据库中显式检索它(它将被延迟加载)。
答案 1 :(得分:2)
有关如何执行此操作的示例,请参阅新的EF Code First MVC教程系列。该系列中的第6个就是一个例子。 10系列中的第一个是: http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application