如何为实体框架复杂类型添加导航属性

hmi*_*aya 5 linq-to-entities entity-framework visual-studio

我正在使用VS2010 Beta 2,我有一个名为Address的复杂类型,具有以下属性:

  • CountryId

我有一个国家实体在我的模型中定义,但我似乎无法找到一种方法,从添加引用(导航属性)CountryId我的复杂类型的财产编号我的财产国家实体.

我是以错误的方式来做这件事,还是我不能与设计师做的事情?......

我有另一个选择就是创建一个Address实体,但它对我来说听起来不对.

Cra*_*ntz 5

不,你不能这样做,因为它违背了复杂类型和导航属性的想法.复杂类型具有值语义,而不是引用标识.导航属性是第一类实体并具有引用语义.因此,它们不能成为复杂类型的一部分.您似乎已经发现,解决方案是将具有值语义的部分分区为复杂类型,并将其添加到包含所需导航属性的实体.

  • 这如何违反价值语义?navigation属性只是对实体的引用. (3认同)
  • 该链接谈论结构.DDD中的值类型都是没有自己标识的类型.想想问题中的样本.它是一种值类型,因为无论引用是否为实体,具有相同值的两个地址都是可互换的. (2认同)
  • DDD不会阻止值类型引用实体.http://stackoverflow.com/questions/9498637/should-value-object-hold-reference-to-entity如果两个地址引用同一个城市怎么办?它会使它们不可互换吗?那么Hibernate支持这个吗?是的,差不多从一开始.EF应该支持吗?绝对而且可能会.因此,虽然盲目地捍卫像DDD这样的方法是错误的,但保护像EF这样的实现更糟糕. (2认同)

hmi*_*aya 2

好的,

实体框架的当前版本似乎不支持复杂类型中的导航属性或外键。

另一个明智的选择是创建一个单独的地址实体,它将拥有所需的所有外键,然后在所有其他实体中创建导航属性。