Asp.net mvc 3 EF 4.1中的ComplexType集合属性,代码优先

Asp.net mvc 3 EF 4.1中的ComplexType集合属性,代码优先,asp.net-mvc-3,entity-framework-4.1,ef-code-first,complextype,Asp.net Mvc 3,Entity Framework 4.1,Ef Code First,Complextype,是否可以在作为ComplexTypes集合的POCO中创建属性 [ComplexType] public class Attachment { public string FileName { get; set; } public byte[] RawData { get; set; } public string MimeType { get; set; } } public class TestObject { public TestOb

是否可以在作为ComplexTypes集合的POCO中创建属性

[ComplexType]
public class Attachment
{        
    public string FileName { get; set; }

    public byte[] RawData { get; set; }

    public string MimeType { get; set; }
}

public class TestObject
{
    public TestObject()
    {
        Attachments = new List<Attachment>();
    }

    public virtual ICollection<Attachment> Attachments { get; set; }
}
[ComplexType]
公共类附件
{        
公共字符串文件名{get;set;}
公共字节[]RawData{get;set;}
公共字符串MimeType{get;set;}
}
公共类测试对象
{
公共测试对象()
{
附件=新列表();
}
公共虚拟ICollection附件{get;set;}
}

我觉得这是不可能的。。。我一直在尽我最大的努力研究它,在我看来,复杂类型比它们的价值更麻烦,有几个原因。

你的感觉是对的:这是不可能的。复杂类型的目的是将其属性作为列嵌入父类型的表中。如何将动态集合嵌入到表的一行中?从复杂类型集合的存储方式来看,您希望从中得到什么


实际上,您需要的是一个普通的导航属性(基本上需要删除
[ComplexType]
属性)。在我看来,
测试对象
附件
之间的关系就像是
订单
订单项
之间的关系:
订单项
唯一地引用一个
订单
(它有一个指向订单的外键)并且可能启用了级联删除,以确保项目与其顺序一起删除,并强调项目对顺序的依赖性。通过使
订单项
/
附件
成为一个复杂类型,您还想实现什么样的特殊功能?

这是不可能的,但不是因为Slauma所说的概念不匹配,而是因为EF没有实现它。查看以了解有关收集支持的更多详细信息,以及其他内容


也就是说,让它成为一个实体可能更好。你不需要包装它:你可以有一个未映射的基本
附件
类型,然后是特定的子类型。

我试图使用ComplexType,因为我心目中的附件与我见过的其他复杂类型(名称、地址等)的示例非常相似-我认为一次声明该类型并在多个位置重用它是有意义的。我想我会保留它,但只要在需要的地方将ComplexType包装到另一个POCO中即可。谢谢,很有趣!您知道NH如何在存储级别实现复杂类型集合吗?我可以想象一个“隐藏”表(与模型中的实体不对应,类似于EF中的多对多联接表),由ORM框架内部管理。每次加载父实体时,数据库中的联接也会获取集合。是这样还是类似?@Slauma:复杂类型与标量类型没有区别。对于整数集合,您将有一个包含两列的表:值和父项的FK。对于附件,将有FK和其他3列。关系总是一对多,而不是多对多,因为复杂类型本身并不存在。加载可以是急切的,也可以是懒惰的,就像任何其他集合一样。