我目前有一个基于 sql server 2008 中的数据结构的复杂实体关系设置。
我认为我想做的事情非常简单,但我却费了好大劲,花了几天时间试图弄清楚。
我有一个地址和地址类型表,它们在地址类型 ID 上连接。有 2 个地址类型:“账单”和“送货”。我希望能够为计费和运输创建自定义实体。我本以为我可以从 Address 实体继承并添加一个条件来检索正确的类型,但它并不那么简单。
我不想从这些现有实体中删除导航属性或字段,以便我们可以在需要时深入研究这些预先存在的实体。
目标是创建自定义实体,其中包含基于特定标准的其他实体的字段...几乎就像 SQL Server 的 View 所做的那样。从字面上看,我在互联网上找到的所有示例都不清楚如何执行此操作。
我现在拥有的是每种具体类型的表(我相信)。每次我尝试这样做时,都会对我大喊大叫,告诉我事情没有映射等等......然后我映射它们然后收到新的错误消息。有没有好的、清晰的教程?我不想深入研究 ssdl 等,因为当我重建模型时这些会被覆盖。
延迟加载被禁用......这就是我想要的。
为什么我不能只创建一个新实体,复制并粘贴字段并设置表映射?我创建了一个名为 BillingAddress 的新实体,复制了 Address 中的字段并设置表映射...然后出现错误:
错误 297 错误 3033:从第 4525 行开始的映射片段出现问题:EntitySets“BillingAddresses”和“Addresses”均映射到表“Address”。它们的主键可能会发生冲突。
我还尝试从地址表继承...错误:必须在设置地址中指定所有类型的映射
最佳答案
如果我正确理解您的架构,您将拥有一个带有鉴别器列 addressTypeID
的 Address
表,该表定义了哪种地址特定记录代表。单个地址
表包含两种类型的记录...帐单和送货地址。如果是这种情况,那么您实际上拥有一个 Table-Per-Hierarchy 或 TPH 结构,因为每个类层次结构有一个表。
您提到您认为自己拥有 Table-Per-Concrete-type(TPC)结构。如果是这种情况,那么您的数据库将需要 ShippingAddress
和 BillingAddress
表,因为在 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
}
然后,您需要将 ShippingAddress
和 BillingAddress
类型的类层次结构映射为单个 Address
表上的 TPH 映射,并区分addressTypeID
列。 AddressType 列甚至不会在映射中发挥作用,除非您希望通过某些 AddressType 名称或代理键进行映射。在这种情况下,显示相应 Address 和 AddressType 表的合并 View 的 View 将成为您的基本 TPH 架构源,其中鉴别器列是 AddressType 表中包含的代理键列。
关于.net - Entity Framework 4.0 创建从其他实体派生的新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3136497/