2012-08-23 49 views
3

在MSDN上的文档关于这一主题明确: “复合类型不能包含关联”的ComplexType与协会

当阅读复杂的类型,最常用的例子就是地址的ComplexType:

class Person 
{ 
    public Address Address { get; set; } 
} 
class Address 
{ 
    public string Street { get; set; } 
    public string Zip { get; set; } 
    public string CountryId { get; set; } 
} 

我想要将国家定义为关联:

class Address 
{ 
    //other properties .... 
    public Country Country { get; set; } //vs: string CountryId { get; set; } 
} 

正如您所看到的,我想在广告中添加关联到国家/地区着装ComplexType。不幸的是,这是不可能的。这使得完整的例子没有意义,因为我必须在Person类型本身上定义Country关联,这会使整个Address-CT无用。

我们目前正在使用NHibernate设置一个项目,因为EF缺乏我们项目所需的一些功能,但最有可能在EF 6中支持这些功能。考虑到EF和最近公布的开源模型的快速发展,我们希望保持从NH到EF可能的未来迁移。 在NHibernate ComplexTypes(“组件”)中支持关联,因此如果我们现在将它们用于NH,迁移到EF将不太可能。

我想知道这是否只是目前的限制?

  • 是否有计划在未来支持这样的功能?
  • 是否存在不支持此功能的明确原因,还是仅仅是“未实现atm”?
+1

这是一个设计问题,您应该直接询问[ADO.NET团队](http://entityframework.codeplex.com/discussions)。 –

+0

好的,我会在那里发布。 Thx为链接。 –

+1

请记住,EF中的ComplexTypes是可重用的,因此多个实体可以具有相同ComplexType的属性。因此,在复杂类型的属性与另一个属性之间建立关联并不是真的可行,因为如果复杂类型在多个实体中使用,这样的关联可能不起作用。然而,如果实施的话,它可以工作的方式是定义一个协会,该协会将指向复杂类型的财产作为“终点”(就关系/相关终结财产而言)。 – Pawel

回答

0

评论中提到了可能的计划。

关于第二个问题,我会说“就在这一刻”。

我认为如果开发者有明确的理由不具备此功能是不合理的。是的,它应该明智地使用,但不应该有任何API?

不是每个实体都直接与另一个实体关联,因此限制这是没有意义的。如果我有一个必须引用一个实体的Address,为什么这与任何一个属性都不相同?

这种情况下的复杂类型与简单类型没有区别。也许复杂类型可以在某些情况下被识别为“可重用”。但是,在DDD“规则”下,似乎没有真正的原因,复杂类型不能引用实体。