我有一个实体,它定义了许多不同实体的属性。
例如
class user{
ICollection<PropertyEntity> properties {get;set;}
}
class company{
ICollection<PropertyEntity> properties {get;set;}
}
当我从用户或公司删除PropertyEntity时。
myUser.properties.Remove(someProperty);
PropertyEntity不会被删除,只是将它的外键设置为null。
我知道我可以使用[Key]注释来定义外键。但据推测,这需要两个键而不是其中一个?
如何让EF构建该关系,以便用户或公司可以拥有许多PropertyEntity。但是,如果没有用户或公司,PropertyEntity会被删除吗?
答案 0 :(得分:0)
如果关系是可选的,则无法定义关系,因此从导航集合中删除子项也会将其从数据库中删除。
你必须为孩子打电话DbSet<T>.Remove
......
myUser.properties.Remove(someProperty);
if (!someProperty.CompanyId.HasValue)
context.PropertyEntities.Remove(someProperty);
...(也会自动从集合中删除子节点),或者您可以尝试在提交更改之前删除被覆盖的SaveChanges
中的“孤儿”:
public override int SaveChanges()
{
PropertyEntities.Local
.Where(p => !p.UserId.HasValue && !p.CompanyId.HasValue)
.ToList()
.ForEach(p => PropertyEntities.Remove(p));
return base.SaveChanges();
}
Arthur Vickers' blog详细解释了这种方法。
设置identifying relationship(支持从导航集合中删除子项时将从数据库中删除)确实只有在需要关系的情况下才有可能,所以它不适合你