我有两个模型类:
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=desertToRemoveId
从一个拥有Id=personId
ans的人中删除一个沙漠,并在数据库中保存更改?没有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;}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句