【问题标题】:EntityFramework Join table with more than 2 entitiesEntityFramework 连接超过 2 个实体的表
【发布时间】:2013-02-11 20:46:26
【问题描述】:

我有 4 个表/实体,它们分为两组,警报和收件人。一个组中的任何一个实体都可以映射到另一个组的任何一个实体(一个警报可以有多个 Recipients 和 RecipientGroups 等等)。

表格:

  • 警报
  • AlertGroups(与警报的一对多关系)
  • 收件人
  • RecipientGroups(与收件人的多对多关系)

我不想制作 4 个可连接对象(AlertRecipients、AlertRecipientGroups 等),而是制作一个包含 4 列的连接表,每列都是我的一种实体类型的可为空的 FK。

我已经在 SQL 中创建了表格,并使用 Fluent API 设置了我的上下文,如下所示:

modelBuilder.Entity<AlertGroup>()
                .HasMany(ag => ag.RecipientGroups)
                .WithMany(rg => rg.AlertGroups)
                .Map(m => m.ToTable("AlertRecipients")
                    .MapLeftKey("AlertGroupID")
                    .MapRightKey("RecipientGroupID"));

            modelBuilder.Entity<AlertGroup>()
                .HasMany(ag => ag.Recipients)
                .WithMany(rg => rg.AlertGroups)
                .Map(m => m.ToTable("AlertRecipients")
                    .MapLeftKey("AlertGroupID")
                    .MapRightKey("RecipientID"));

但我收到此错误:

指定的架构无效。错误:

(251,6):错误 0019:带有架构的 EntitySet 'AlertGroupRecipient' 'dbo' 和表 'AlertRecipients' 已经定义。每个实体集 必须引用唯一的架构和表。

是否有解决方法来做我想做的事情?

【问题讨论】:

  • 只是一个疯狂的猜测.. 我认为AlertGroup 包含Alerts 等?您不能将关联限制为一个多对多关联AlertGroups-RecipientGroups,其中一个成员为单一形式的组? (也许有一些特殊的业务逻辑)。具有可为空 FK 的联结表不是一个很好的构造,并且只有少数允许的列组合的联结表没有规范化并且容易出错。最后,也许最好的选择是 4 个联结表。
  • @GertArnold 我知道它没有标准化,但是 4 个联结表看起来很笨拙。此外,我还有另一组关系,将两个实体中的任何一个映射到任何一个或 3 个实体(现在有 6 个联结表),我也想将它们全部放入一个表中。
  • 我理解您的反对意见。这些接线表有时也让我发疯。不过,我更喜欢简洁的数据库模型,1 个表对应 1 个关联。数据模型非常基础,以后很难更改。多年来一直困扰着你的任何妥协(我知道,我有一些)。

标签: entity-framework entity-framework-5


【解决方案1】:

EF 无法以这种方式做到这一点。使用 EF,您需要为每个多对多关系使用单独的连接表(因为这是您应该这样做的方式)。如果您想以自己的方式执行此操作,则不能在映射中使用多对多关联。您必须改为将您的AlertRecipients“升级”为真实实体(模型中的另一个类)并处理诸如一对多关联之类的所有事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2017-10-10
    相关资源
    最近更新 更多