我在实体框架中遇到外键关系方面的麻烦。我有两个表:Persons
和Countries
。 Persons
具有一个CountryId
的外键列。
由于Countries
表很少更改,因此我只想获取其数据一次,处置DatabaseContext
,并将Countries
列表保留在某个地方。这就是我遇到问题的地方。
实体框架似乎希望您打开数据库上下文,根据需要添加/编辑行,然后关闭数据库上下文。如果打开,则获取数据,然后关闭;然后打开,保存数据,关闭;它有麻烦。
所以我的POCO对象看起来像这样:
public class Country {
public int CountryId {get; set; }
public String Name {get; set; }
}
public Person {
public int PersonId {get; set; }
public virtual Country Country {get; set; }
}
然后,我尝试创建一个像这样的新人:
Country[] countries;
using (var dt = new DatabaseContext())
{
countries= dt.Countries.ToArray();
}
Person person = new Person();
person.Country = countries[0];
using (var dt = new DatabaseContext()) {
dt.Entities.Add(person);
dt.SaveChanges();
}
保存时,实体框架在
Countries
表中创建一个与countries[0]
相同名称的新行,但增加一个新的ID。这显然不是期望的结果-此人应将其Country_CountryId
字段设置为countries[0]
的ID,并且不应创建新行。我该如何解决?我认为一种解决方案是,当为实体框架提供已设置主键的对象时,强制实体框架不创建新行。有没有办法做到这一点?
最佳答案
我想知道在您投入大量精力描述问题之前,您是否至少在Internet上进行了一些搜索,因为这是每隔几天会问一次的非常普遍的问题。Add
方法将所有实体添加到实体图中。因此,如果将country
连接到person
并且country
未附加到当前上下文,则在Add
上调用person
会将person
和country
都标记为要插入的新实体。如果您不想插入country
,则必须告诉EF country
不是新实体:
Person person = new Person();
person.Country = countries[0];
using (var dt = new DatabaseContext()) {
dt.Entities.Add(person);
dt.Entry(person.Country).State = EntityState.Modified;
dt.SaveChanges();
}
关于c# - Entity Framework 中的外键无法正确更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10172497/