【问题标题】:Entity Framework 4.0 Creating a new entity derived from other entitiesEntity Framework 4.0 创建从其他实体派生的新实体
【发布时间】:2010-06-29 11:51:00
【问题描述】:

我目前有一个基于我在 sql server 2008 中的数据结构的复杂实体关系设置。

我正在尝试做的事情我认为会非常简单,但我正在拔头发并且花了几天时间试图弄清楚。

我有一个地址和地址类型表,它们在地址类型ID 上连接。有 2 种地址类型,“计费”和“运输”。我希望能够为计费和运输创建一个自定义实体。我原以为我可以从 Address 实体继承并添加一个条件来检索正确的类型,但它不是那么简单。

我不想从这些现有实体中删除导航属性或字段,以便我们可以在需要时深入了解这些预先存在的实体。

目标是创建自定义实体,其中包含基于某些条件的其他实体的字段......几乎就像视图为 SQL Server 所做的那样。从字面上看,我在互联网上找到的所有示例都不清楚如何做到这一点。

我现在拥有的是每种混凝土类型的表格(我相信)。每次我尝试这样做时都会对我大喊大叫,告诉我事情没有映射等等......然后我映射它们然后得到一条新的错误消息。那里有什么好的教程吗?我宁愿不深入研究 ssdl 等,因为当我重建模型时它们会被覆盖。

延迟加载被禁用...这就是我想要的。

为什么我不能只创建一个新实体、复制并粘贴字段并设置表映射?我创建了一个名为 BillingAddress 的新实体,从 Address 中复制了字段并设置了表映射....然后我得到了错误:

错误 297 错误 3033:从第 4525 行开始映射片段时出现问题:EntitySets 'BillingAddresses' 和 'Addresses' 都映射到表 'Address'。它们的主键可能会发生冲突。

我也尝试从地址表继承....错误:必须为设置地址中的所有类型指定映射

【问题讨论】:

    标签: .net entity-framework entities


    【解决方案1】:

    如果我正确理解了您的架构,您就有一个带有鉴别器列 addressTypeIDAddress 表,它定义了特定记录所代表的 地址 类型。单个 Address 表包含两种类型的记录...帐单送货地址。如果是这种情况,那么您实际上有一个 Table-Per-Hierarchy 或 TPH 结构,因为每个类层次结构都有一个表

    您提到您认为您有一个 Table-Per-Concrete-type 或 TPC 结构。如果是这种情况,那么您的数据库将需要 ShippingAddressBillingAddress 表,因为在 TPC 中,每个具体类型都有一个表

    您需要具有类似于以下的代码结构:

    public abstract class Address
    {
        // Common address properties
    }
    
    public class ShippingAddress: Address
    {
        // Additional shipping-address specific properties
    }
    
    public class BillingAddress: Address
    {
        // Additional billing-address specific properties
    }
    

    然后,您需要将 ShippingAddressBillingAddress 类型的类层次结构映射为单个 Address 表上的 TPH 映射,在 addressTypeID 列上进行区分。 AddressType 列甚至不会在映射中发挥作用,除非您希望通过某个 AddressType 名称或代理键进行映射。在这种情况下,呈现适当 Address 和 AddressType 表的合并视图的视图将是您的基本 TPH 架构源,其中鉴别器列是 AddressType 表中包含的代理键列。

    【讨论】:

    • jrista 另一个问题。如果我们继续这个示例并希望拥有一个同时包含 BillingAddress 和 ShippingAddress 的 User 类,我们将如何在 Entity Framework 中对此进行建模。我不想要地址类的集合,我想要同一张表有 2 个不同的关联。我们如何才能做到这一点?
    • @Ken:它应该像简单地拥有两个适当类型的属性一样简单。 ORM 框架应该足够智能以检测正在使用的类型,并通过您的模型/映射配置生成适当的查询。
    【解决方案2】:

    实际上,这听起来更像是逐层表,或者可能是概念模型中的水平分区。请参阅 this MSDN page 了解(相当少的)有关受支持架构的文档。

    如果该链接没有足够的帮助,请发布您的确切表定义和您想要的实体设计(类和属性),我们会解决的。

    【讨论】:

    • 这有点尴尬,但是对于我所做的所有 EF4 工作,我从未接触过(或学习过)XML 后端。所以你的后续帖子对我来说有点希腊......
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    相关资源
    最近更新 更多