插入一条记录,该记录使用实体框架引用其他表中的记录
本文关键字:记录 其他 引用 框架 一条 插入 实体 | 更新日期: 2023-09-27 18:08:56
这是一个相当基本的问题,但我很惊讶没有找到一个像样的答案。
考虑以下数据库模式:
Person {PersionID, Name, CountryOfBirthID [references Country]}
Country {CountryID, CountryName}
应用程序在启动期间从数据库中读取所有国家,并将它们保存在一个列表中。每当我添加一个新人员时,我都会使用上面提到的列表中的ID和数据创建一个新的Country对象。我希望EF插入一个新的人与ID引用国家表中的记录,但它插入一个新的记录到国家表,并分配它一个新的ID,这显然不是我想要的。
插入引用其他表中的记录的新记录的传统方法是什么?我假设,每当我添加一个Persion(在相同的上下文中)并重用已获取的记录时,我都可以通过ID获取Country记录,但是是否有其他方法允许我仅访问Person表?
简单的答案是,你需要'Attach'
你的Country
首先(即,让实体框架知道,它已经存在于上下文/数据库):
var person = new Person { ... };
var country = new Country { Id = ... } // or _countriesList[2] in your case;
person.Country = country;
context.Attach(country);
context.SaveChanges();
同样,如果你在Visual Studio中使用设计器创建实体,你的实体应该包含一个名为'EntityReference'
的属性,你可以使用它来实现相同的结果:
var person = new Person {};
person.Country.EntityReference = new EntityKey("MyEntities.Countries", "CountryId", countryId);
(MyEntities取代"。country '和'CountryId'(具有相应值)
然而,我认为最简单的方法是在你的实体中"暴露"外键:
class Person
{
....
Country CountryOfBirth { get; set; }
int CountryOfBirthID { get; set; }
}
//then:
var person = new Person { ... };
person.CountryOfBirthId = 2;
如果您正在寻找一种更通用的方法来处理此问题,请查找Identity Map
模式。