2013-04-13 111 views
2

这是一个相当基本的问题,但我很惊讶没有在任何地方找到合适的答案。使用实体框架插入引用其他表中记录的记录

考虑下面的数据库模式:

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

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

什么是插入一个新的记录引用记录在其他表中的传统方式? 我认为,每当我添加Persion(在相同的上下文中)并重新使用提取的记录时,我可以通过ID获取国家/地区记录,但有没有其他方法可以让我只访问Person表?

回答

2

简单的答案是,你需要'Attach'Country第一(即,让实体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中,你的实体应包含一个名为'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模式。

相关问题