这是一个相当基本的问题,但我很惊讶没有在任何地方找到合适的答案。
考虑以下数据库架构:
Person {PersionID, Name, CountryOfBirthID [references Country]}
Country {CountryID, CountryName}
应用程序在启动期间从数据库中读取所有国家/地区并将其保留在列表中。 每当我添加一个新人时,我都会创建一个新的Country对象,其中包含上述列表中的ID和数据。我希望EF插入一个新的Person,其ID引用Country表中的记录,但它会在Country表中插入一条新记录并为其分配一个新的ID,这显然不是我想要的。
插入引用其他表中记录的新记录的常规方法是什么? 我假设,每当我添加一个Persion(在相同的上下文中)并重用一个获取的记录时,我可以通过ID获取Country记录,但是还有其他一些方法可以让我只访问Person表吗?
答案 0 :(得分:2)
简单的答案是你首先需要'Attach'
你的Country
(即让Entity Framwork知道它已经存在于上下文/数据库中):
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中的Designer创建实体,则您的实体应包含名为'EntityReference'
的属性,您可以使用该属性来实现相同的结果:
var person = new Person {};
person.Country.EntityReference = new EntityKey("MyEntities.Countries", "CountryId", countryId);
(将'MyEntities.Countries'和'CountryId'替换为适当的值)
然而,我认为最简单的方法是在您的实体中“公开”外键:
class Person
{
....
Country CountryOfBirth { get; set; }
int CountryOfBirthID { get; set; }
}
//then:
var person = new Person { ... };
person.CountryOfBirthId = 2;
如果您正在寻找更通用的方法来处理此问题,请查找Identity Map
模式。