EF多个外键只需要1个

时间:2013-07-17 13:45:31

标签: c# .net entity-framework ef-code-first

我有一个实体,它定义了许多不同实体的属性。

例如

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会被删除吗?

1 个答案:

答案 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(支持从导航集合中删除子项时将从数据库中删除)确实只有在需要关系的情况下才有可能,所以它不适合你