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

时间:2010-06-03 00:53:31

标签: c# entity-framework entity-framework-4

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

  • Page的主键为(PageCode,Version),
  • View的主键为(ViewCode,Version)。
  • PageView显然有足够的PageCode,ViewCode和Version。
  • FK to Page是(PageCode,Version)和FK to View是(ViewCode,Version)

有道理并且有效,但当我尝试在实体框架中映射时,我得到了

  

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

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

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

有没有人遇到过这个问题,有什么我可以解决的吗?谢谢!

4 个答案:

答案 0 :(得分:6)

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

干杯

答案 1 :(得分:3)

经过多次阅读和讨论,这只是EF设计师和验证员在处理多种关系时的一个限制。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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