实体框架4.0创建从其他实体派生的新实体

时间:2010-06-28 22:06:22

标签: .net entity-framework entities

我目前根据sql server 2008中的数据结构设置了复杂的实体关系。

我想要做的事情我认为这会非常简单,但是我把头发拉了出来并花了好几天试图解决它。

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

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

目标是根据certian标准创建包含来自其他实体的字段的自定义实体...几乎与视图对SQL服务器的作用相同。我在网上找到的所有例子都不清楚如何做到这一点。

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

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

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

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

我也尝试从Address表继承....错误:必须在Set Addresses中指定所有类型的映射

2 个答案:

答案 0 :(得分:3)

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

您提到您认为自己有一个Table-Per-Concrete类型或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模式源,其中discriminator列是AddressType表中包含的代理键列。

答案 1 :(得分:0)

实际上,它听起来更像是每层次的表格,或者概念模型中的水平分区。有关支持的体系结构的(相当少)文档,请参阅this MSDN page

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