EF 4.1 中使用 Code First 的 ComplexType 集合属性

Posted

技术标签:

【中文标题】EF 4.1 中使用 Code First 的 ComplexType 集合属性【英文标题】:ComplexType Collection Property in EF 4.1 with Code First 【发布时间】:2011-08-25 19:36:29 【问题描述】:

是否可以在作为 ComplexType 集合的 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; 

我觉得这是不可能的……我一直在尽我所能研究它,但在我看来,ComplexTypes 比它们的价值更麻烦,原因有很多。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

有趣!您知道 NH 是如何在商店级别实现复杂类型集合的吗?我可以将类似“隐藏”表的图像(不对应于模型中的实体,类似于 EF 中的多对多连接表)并在内部由 ORM 框架管理。每次加载父实体时,也会通过数据库中的连接来获取集合。是这样的还是类似的? @Slauma:复杂类型与标量类型没有区别。对于整数集合,您将有一个包含两列的表:值和父级的 FK。对于附件,您将拥有 FK 和其他 3 列。关系总是一对多,而不是多对多,因为复杂类型本身并不存在。加载可以是急切的或懒惰的,就像任何其他集合一样。【参考方案2】:

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

你需要的其实是一个普通的导航属性(基本上[ComplexType]属性需要去掉)。在我看来,TestObjectAttachment 之间的关系就像OrderOrderItem 之间的关系:OrderItem 唯一地指向一个Order(它有一个指向订单的外键) 并可能启用级联删除,以确保项目与其订单一起被删除,并强调项目对订单的依赖性。通过将OrderItems/Attachments 设为复杂类型,您还想实现什么特别的目标?

【讨论】:

我试图使用 ComplexType,因为我脑海中的附件与我在 ComplexTypes 中看到的其他示例(名称、地址等)非常相似 - 我认为声明是有意义的该类型一次并在多个地方重用它。我想我会保留它,但只需将 ComplexType 包装在我需要的另一个 POCO 中。谢谢。

以上是关于EF 4.1 中使用 Code First 的 ComplexType 集合属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Code-First EF 4.1 从数据库中删除多个项目

EF 4.1 Code First - 我应该使用啥模式?

EF 4.1 Code First - 在 Firebird 数据库中存储图像

在使用 EF 4.1 Code-First 的 Include 和/或 Select 方法时订购导航属性?

使用EF 4.1 Fluent Code First的每类型表继承

使用共享主键关联时,EF 4.1 Code First 中的级联删除规则