我有以下两个模型和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; }
}
然后,我声明一份人员列表和一份车辆列表,将第一辆车的所有者设置为列表中的第一个人:
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") } };
我用下面的代码把它保存到数据库中,这样做很好。
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();
}
如果我将车主更改为第二个人并再次运行代码,则车主属性不会得到更新。
Cars[0].Owner = People[1];
你知道我做错了什么吗?谢谢你的帮助。
最佳答案
我认为这是一个independent vs foreign key association的问题。您目前正在使用独立的关联,car和person之间的关系实际上是由单独的entry对象管理的,该对象有自己的状态(要访问此对象,必须使用objectcontext api)。将car的实体条目设置为modified state不会更改关系条目的状态!简单的解决方案是使用外键关联,这意味着向汽车添加新的Guid PersonId
属性,并将其映射为Person
导航属性的外键属性。
如果坚持使用独立的关联,则只应更改附加实体上的关系,否则,跟踪这些更改并将所有必需的条目设置为正确的状态会让您头疼不已。它应该足以创建对象,将它们附加到上下文中,并且只有在设置了车主之后,才有可能被跟踪为一个更改。