【问题标题】:EF Multiple foreign keys only 1 requiredEF 多个外键 仅需要 1 个
【发布时间】:2013-07-17 13:45:31
【问题描述】:

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

例如。

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 没有用户或公司,它会被删除吗?

【问题讨论】:

  • 您是真的“删除”PropertyEntity 还是只是将其从集合中删除?
  • 所以你想级联删除?你是用fluent API定义这种关系吗?
  • 这不是级联删除,因为父实体没有被删除。我所做的就是将它从收藏中删除。但它没有从数据库中删除。我正在寻求有关如何使用 fluent API 真正定义它的建议。
  • 我们可以看看你是如何删除你的实体/也许是你现有的映射吗?

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


【解决方案1】:

如果关系是可选的,则无法定义关系,以便从导航集合中删除子项也会将其从数据库中删除。

您必须为孩子拨打DbSet&lt;T&gt;.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(它支持在从导航集合中删除子对象时从数据库中删除)确实只有在需要关系时才有可能,所以这不是你的选择。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2018-12-13
    相关资源
    最近更新 更多