Entity framework EntityFramework联接表包含2个以上的实体
我有4个表/实体,分为两组:警报和收件人。一个组中的任何一个实体都可以映射到另一个组中的任何一个实体(警报可以有多个收件人和收件人组等) 表:Entity framework EntityFramework联接表包含2个以上的实体,entity-framework,entity-framework-5,Entity Framework,Entity Framework 5,我有4个表/实体,分为两组:警报和收件人。一个组中的任何一个实体都可以映射到另一个组中的任何一个实体(警报可以有多个收件人和收件人组等) 表: 警报 警报组(与警报的1对多关系) 接受者 接收方组(与接收方的多对多关系) 与创建4个联接表(AlertRecipients、AlertRecipientGroups等)不同,我希望创建一个包含4列的联接表,每列都是我的一种实体类型的可为null的FK 我用SQL创建了表,并使用Fluent API设置了上下文,如下所示: modelBuilder
- 警报
- 警报组(与警报的1对多关系)
- 接受者
- 接收方组(与接收方的多对多关系)
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"));
modelBuilder.Entity()
.HasMany(ag=>ag.recipientGroup)
.WithMany(rg=>rg.AlertGroups)
.Map(m=>m.ToTable(“AlertRecipients”)
.MapLeftKey(“AlertGroupID”)
.MapRightKey(“RecipientGroupID”);
modelBuilder.Entity()
.HasMany(ag=>ag.Recipients)
.WithMany(rg=>rg.AlertGroups)
.Map(m=>m.ToTable(“AlertRecipients”)
.MapLeftKey(“AlertGroupID”)
.MapRightKey(“收件人ID”);
但我得到了这个错误:
指定的架构无效。错误:
(251,6):错误0019:具有架构的EntitySet“AlertGroupRecipient”
已定义“dbo”和表“AlertRecipients”。每个实体集
必须引用唯一的架构和表
我想做的事情有解决办法吗?EF不能这样做。使用EF,您需要为每个多对多关系使用单独的联接表(因为这是您应该使用的方法)。如果您想按自己的方式进行,则不能在映射中使用多对多关联。相反,您必须“升级”您的
AlertRecipients
到真实实体(模型中的另一个类),并像处理一对多关联一样处理所有事情。只是一个猜测。。我认为警报组
包含警报
,等等。?您不能将关联仅限于一个多对多关联警报组
-接收者组
,其中一个具有1个成员的组充当单一表单吗?(可能有一些特殊的业务逻辑)。具有可为空FKs的连接表不是一个好的构造,只有少数允许的列组合的连接表是不规范的,并且容易出错。最后,也许最好的选择是4个连接表。@GertArnold我知道它不是标准化的,但是4个连接表看起来很笨拙。另外,我还有一组关系,两个实体中的任何一个映射到任意或3个实体(现在有6个连接表),我想把它们都推到一个表中。我理解你的反对意见。这些连接台有时也让我发疯。尽管如此,我还是喜欢简洁的数据库模型,一个表对应一个关联。数据模型非常基础,以后很难更改。任何妥协都会困扰你很多年(我知道,我有一些)。