在Entity Framework中以多对多关系映射复合外键

我有一个Page表和一个View表。 这两者之间通过PageView表有很多关系。 不幸的是,所有这些表都需要具有复合键(出于商业原因)。

  • 页面有一个主键(PageCode,Version),
  • View具有(ViewCode,Version)的主键。
  • PageView显然足够有PageCode,ViewCode和Version。
  • FK to Page是(PageCode,Version)和FK to View是(ViewCode,Version)

有意义并且有效,但当我尝试在Entity框架中映射时,我得到了

错误3021:映射片段中的问题…:表PageView中的以下每个列都映射到多个概念侧属性:PageView.Version映射到(PageView_Association.View.Version,PageView_Association.Page.Version)

很明显,EF抱怨版本列是两个外键的常见组件。

显然,我可以在连接表中创建一个PageVersion和ViewVersion列,但这种方法会破坏约束点,即Page和View必须具有相同的Version值。

有没有人遇到这个,有什么我可以做到的吗? 谢谢!

我不知道entity framework中针对此问题的解决方案,但解决方法可能是将主键列添加到表中,并在您希望充当复合键的字段上添加唯一约束。 这样,您可以确保数据的唯一性,但仍然只有一个主键列。 可以在此主题下找到Pro-con参数: stackoverflow问题

干杯

经过多次阅读和讨论后,这只是EF设计师和validation员在处理多种关系时的局限性。

我打算写一下你应该使用代理键,但我认为这不会对你有所帮助。 连接表基于实体的逻辑属性强制执行业务规则 – 即使使用代理键扩充了页面和视图,这些相同的属性也将存储在连接表中。

如果您在支持约束的服务器上执行,则可以将Version分隔为PageVersion和ViewVersion,并添加两者相等的约束,或使用INSERT / UPDATE触发器来强制执行此操作。

我可能只是误解了意图,但我觉得这个设计似乎有些不对劲。 我无法想象版本控制将如何工作,因为页面和视图已更改并且新版本已创建。 如果更改页面意味着它获得了新版本,那么它也会导致所有视图的新版本,即使对于那个版本中没有更改的视图也是如此。 同样,如果页面中的一个视图发生更改,则视图的版本也会更改,这意味着页面的版本也必须更改,因此该页面中的所有其他视图也会更改,因为页面和视图版本必须匹配。 这看起来是对的吗?

考虑使用nHibernate? 🙂 – 或者至少比数据库中的简单连接更多。 我正在使用EF4,目前它似乎还不够复杂的数据图表IMO。 希望它会到达那里!