实体框架-通过更改外键更新关系 [英] Entity Framework - Updating relationship by changing foreign key
问题描述
我有以下两个模型和DbContext:
I have the two following models and DbContext:
public class TestDbContext : DbContext
{
public IDbSet<Person> People { get; set; }
public IDbSet<Car> Cars { get; set; }
}
public class Person
{
public Person()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual List<Car> Cars { get; set; }
}
public class Car
{
public Car()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual Person Owner { get; set; }
}
然后我声明人员列表和汽车列表,将第一辆汽车的所有者设置为列表中的第一个人:
I then declare a list of people and a list of cars, setting the owner of the first car to the first person in the list:
List<Person> People = new List<Person>()
{
new Person() {Name = "bill", ID = new Guid("6F39CC2B-1A09-4E27-B803-1304AFDB23E3")},
new Person() {Name = "ben", ID = new Guid("3EAE0303-39D9-4FD9-AF39-EC6DC73F630B")}
};
List<Car> Cars = new List<Car>() { new Car() { Name = "Ford", Owner = People[0], ID = new Guid("625FAB6B-1D56-4F57-8C98-F9346F1BBBE4") } };
我使用以下代码将其保存到数据库中,并且工作正常.
I save this off to the database using the following code and this works fine.
using (TestDbContext context = new TestDbContext())
{
foreach (Person person in People)
{
if (!(context.People.Any(p => p.ID == person.ID)))
context.People.Add(person);
else
{
context.People.Attach(person);
context.Entry<Person>(person).State = System.Data.EntityState.Modified;
}
}
foreach (Car caar in Cars)
{
if (!(context.Cars.Any(c => c.ID == caar.ID)))
context.Cars.Add(caar);
else
{
context.Cars.Attach(caar);
context.Entry<Car>(caar).State = System.Data.EntityState.Modified;
}
}
context.SaveChanges();
}
如果我随后将汽车的所有者更改为第二个人并再次运行代码,则汽车所有者"属性不会得到更新.
If I then change the owner of the car to the second person and run the code again, the Car owner property doesn't get updated.
Cars[0].Owner = People[1];
关于我在做什么的任何想法?谢谢你的帮助.
Any ideas to what I'm doing wrong? Thanks for any help.
推荐答案
I believe this is a problem of independent vs foreign key association. You are using independent association at the moment and the relation between car and person is actually managed by separate entry object which has its own state (to access this object you must use ObjectContext API). Setting the car's entity entry to modified state will not change the state of the entry for the relation! The simple solution is to use foreign key association instead which means adding new Guid PersonId
property to your car and map it as foreign key property for Person
navigation property.
如果您坚持使用独立的关联,则只能更改关联实体上的关联,否则跟踪这些更改并将所有必需的条目设置为正确的状态会非常麻烦.创建对象并将它们附加到上下文中就足够了,只有在这之后就设置了汽车所有者-希望它将作为更改进行跟踪.
If you insist on using independent associations you should change relations only on attached entities otherwise you will had a strong headache with tracking those changes and setting all required entries with correct state. It should be enough to create objects, attach them to context and only after that set the owner of the car - hopefully it will be tracked as a change.
这篇关于实体框架-通过更改外键更新关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!