实体框架-通过更改外键更新关系 [英] Entity Framework - Updating relationship by changing foreign key

查看:82
本文介绍了实体框架-通过更改外键更新关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下两个模型和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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆