我在实体框架中遇到外键关系方面的麻烦。我有两个表:PersonsCountriesPersons具有一个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会将personcountry都标记为要插入的新实体。如果您不想插入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/

10-13 07:06