插入一条记录,该记录使用实体框架引用其他表中的记录

本文关键字:记录 其他 引用 框架 一条 插入 实体 | 更新日期: 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模式。