2

这是一个相当基本的问题,但我很惊讶在任何地方都找不到合适的答案。

考虑以下数据库模式:

Person {PersionID, Name, CountryOfBirthID [references Country]}
Country {CountryID, CountryName}

该应用程序在启动期间从数据库中读取所有国家,并将它们保存在一个列表中。每当我添加一个新人时,我都会使用上面提到的列表中的 ID 和数据创建一个新的 Country 对象。我期待 EF 插入一个 ID 引用 Country 表中记录的新 Person,但它会向 Country 表中插入一条新记录并为其分配一个新 ID,这显然不是我想要的。

插入引用其他表中记录的新记录的常规方法是什么?我假设,每当我添加 Persion(在同一上下文下)并重用获取的记录时,我都可以按 ID 获取 Country 记录,但是还有其他方法可以让我只访问 Person 表吗?

4

1 回答 1

2

简单的答案是你需要'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.Countries”和“CountryId”)

然而,我相信最简单的方法是在您的实体中“公开”外键:

class Person
{
  ....
  Country CountryOfBirth { get; set; }
  int CountryOfBirthID { get; set; } 
}

//then:

var person = new Person { ... };
person.CountryOfBirthId = 2;

如果您正在寻找一种更通用的方法来处理此问题,请查找该Identity Map模式。

于 2013-04-13T22:10:48.097 回答