MapKey 与 HasForeignKey 的区别 - Fluent Api

Posted

技术标签:

【中文标题】MapKey 与 HasForeignKey 的区别 - Fluent Api【英文标题】:MapKey vs HasForeignKey Difference - Fluent Api 【发布时间】:2013-03-13 19:31:20 【问题描述】:

实际上有什么区别:

this.HasRequired(a => a.Something)
    .WithMany()
    .Map(a => a.MapKey("SomethingId"));

this.HasRequired(a => a.Something)
    .WithMany()
    .HasForeignKey(a => a.SomethingId);

【问题讨论】:

【参考方案1】:

两个映射将创建完全相同的数据库架构,具有不可为空的外键 SomethingId 和两个相关表之间的引用约束。

当您不想将外键作为模型类中的属性时,使用MapKey 的第一个映射。这种情况下的关联类型称为独立关联。当外键是模型中的属性时,您将使用 HasForeignKey 应用第二个映射。这种类型称为外键关联

在许多情况下,使用外键关联更容易,但许多人认为在对象世界中拥有一个关系工件(外键)不太干净,因此更喜欢独立关联。

以下是关于这两种关联类型及其优缺点的一些参考资料:

http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/ What are Independent Associations and Foreign Key Associations? Code First: Independent associations vs. Foreign key associations?

【讨论】:

“许多人认为对象关系映射工具是为了解决对象关系阻抗不匹配问题,而不是强迫甚至鼓励您使对象模型看起来像是专门围绕如何设计数据被持久化”。在那里,我为你修好了。 我的想法完全正确!如果数据库中有外键,则 MapKey 和 HasForeignKey 之间的区别实际上没有意义,或者您做出了错误的设计决定。恕我直言。

以上是关于MapKey 与 HasForeignKey 的区别 - Fluent Api的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis中@MapKey使用详解

@MapKey----mybatis返回Map

@MapKey----mybatis返回Map

Mybatis源码分析:@Mapkey的使用

JPA和Hibernate中@MapKey、@MapKeyColumn和@MapKeyJoinColumn的区别

如何在 Map<String, Embeddable> 上定义 MapKey 列名