代码之家  ›  专栏  ›  技术社区  ›  Kirk Broadhurst

实体框架中多关系中复合外键的映射

  •  5
  • Kirk Broadhurst  · 技术社区  · 16 年前

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

    • 视图的主键为(ViewCode,Version)。
    • 显然,PageView有PageCode、ViewCode和Version。
    • “FK到”页面是(页面代码,版本),而“FK到视图”是(视图代码,版本)

    这是有意义的,也是可行的,但当我尝试在实体框架中映射时

    错误3021:映射中存在问题 碎片…:以下每一个 多个概念侧属性: PageView.Version已映射到 PageView(关联.Page.Version)

    显然,我可以在join表中创建PageVersion和ViewVersion列,但这样做会破坏约束的要点,即页面和视图必须具有相同的Version值。

    有人遇到过这个问题吗?我能做些什么来解决这个问题吗?谢谢!

    4 回复  |  直到 16 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    我不知道在实体框架中有没有解决这个问题的方法,但一个解决方法是向表中添加主键列,并在要充当复合键的字段上添加唯一的约束。这样可以确保数据的唯一性,但仍有一个主键列。在本主题下可以找到赞成-反对的论点: stackoverflow question

    干杯

        2
  •  3
  •   Kirk Broadhurst    16 年前

        3
  •  2
  •   mdma    16 年前

    我本来想写你应该使用一个代理密钥,但我不认为这实际上会帮助你。联接表正在基于实体的逻辑属性强制执行业务规则—这些相同的属性将存储在联接表中,即使页面和视图增加了代理项键。

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

        4
  •  1
  •   JamesM    16 年前

    考虑使用nHibernate?:)-或者至少是数据库中的简单连接。我正在使用EF4,目前它对于复杂的数据图还不够成熟。希望它能到达那里!