实体框架是否看到数据库中已存在的对象内部的属性更改

本文关键字:对象 内部 属性 存在 是否 框架 数据库 实体 | 更新日期: 2023-09-27 18:20:19

我有两个模型类:

public class Person {
        public int Id { get; set; }
        public string FirstName { get; set; }
       public virtual List<Desert> Deserts {get;set;}
}
public class Desert{
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual List<Person> Persons{get;set}
}

如果我用Seed方法将一些人添加到数据库中,并向他们添加他们最喜欢的沙漠:

var deserts = new List<Desert>{new Desert{Name = "IceCream"}, new Desert{Name = "Cake"}}
var persons = new List<Person> { 
                         new Person{FirstName = "James", Deserts = deserts},
                         new Person{FirstName = "Joanna"}
                        };
                persons.ForEach(person => context.Persons.AddOrUpdate(person));
                context.SaveChanges();

然后在控制器的某个地方调用从人身上移除沙漠的方法(人和沙漠之间的连接/关系):

 //removes desert from a person
 public void RemoveDesert(int personId, int desertToRemoveId) {
            Person person = db.Persons.Find(personId);
            foreach(Desert desert in person.Deserts){
                    if(desert.Id == desertToRemoveId){
                      person.Deserts.Remove(desert);
                   }
            }
            context.saveChanges();
        }

实体框架会看到属性public virtual List<Desert> FavouriteDeserts {get;set;}已更改并更新吗?

如果不是,如何从拥有Id=personId的人身上删除一个拥有Id=desertToRemoveId的沙漠,并将更改保存在数据库中?可以在没有Lambda表达式的情况下完成吗?

实体框架是否看到数据库中已存在的对象内部的属性更改

是的,它会跟踪子对象,除非你告诉它不要这样做。

foreach(Desert desert in person.Deserts){
                    if(desert.Id == desertToRemoveId){
                      person.Deserts.Remove(desert);
                   }
            }

我不认为C#会允许你在迭代集合时修改它

也就是说,你总是可以查询你想删除的对象,然后删除它:

var desertToRemove = person.Deserts.FirstOrDefault(x=> x.Id == desertToRemoveId);
if(desertToRemove != null) person.Deserts.Remove(desertToRemove );

请注意,这只是删除了(人和沙漠之间的)关系,而不是子实体。请在这里阅读这个优秀答案中的细微差异。

此外,您需要将类更改为使用ICollection而不是List:

public virtual ICollection<Person> Persons {get; set; }
public virtual ICollection<Desert> Deserts {get; set;}