使用Entity Framework插入引用其他表中记录的记录

时间:2013-04-13 22:07:04

标签: c# entity-framework c#-4.0 entity-framework-4

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

考虑以下数据库架构:

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

应用程序在启动期间从数据库中读取所有国家/地区并将其保留在列表中。 每当我添加一个新人时,我都会创建一个新的Country对象,其中包含上述列表中的ID和数据。我希望EF插入一个新的Person,其ID引用Country表中的记录,但它会在Country表中插入一条新记录并为其分配一个新的ID,这显然不是我想要的。

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

1 个答案:

答案 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模式。