【发布时间】: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