0

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

例如。

class user{
ICollection<PropertyEntity> properties {get;set;}
}

class company{
ICollection<PropertyEntity> properties {get;set;}
}

当我从用户或公司中删除 PropertyEntity 时。

myUser.properties.Remove(someProperty);

PropertyEntity 没有被删除,它只是将它的外键设置为空。

我知道我可以只使用 [Key] 注释来定义外键。但大概这需要两个键而不是任何一个?

如何让 EF 构建这种关系,以便用户或公司可以拥有许多 PropertyEntity。但是如果 PropertyEntity 没有用户或公司,它会被删除吗?

4

1 回答 1

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 的博客上有更详细的解释。

设置识别关系(这将支持从导航集合中删除子对象时从数据库中删除)确实只有在需要关系时才有可能,因此这不是您的选择。

于 2013-07-17T16:56:25.040 回答