使用 ORM 生成的实体作为多态的域对象
Posted
技术标签:
【中文标题】使用 ORM 生成的实体作为多态的域对象【英文标题】:Using ORM Generated Entities as Domain Objects for Polymorphism 【发布时间】:2012-07-02 07:13:56 【问题描述】:我们需要从下表中生成以下领域类模型。是否可以使用 Linq 2 SQL 来实现它。如果不可能,Entity Framework 会有帮助吗?你能解释一下怎么做吗?
注意:域类的代码在How to Implement Repository FindAll() Method? 中可用。那里也提供映射示例。
注意:我试图避免 Linq 2 SQL 生成的实体和域类之间的映射。
EDIT:“Linq to SQL 作为一种对象关系映射技术,仅支持 Table per Class Hierarchy 策略。这意味着继承层次结构中的所有级别都存储在同一个表中,并且鉴别器列告诉记录代表什么类。”
CREATE TABLE [dbo].[BankAccount](
[BankAccountID] [int] NOT NULL,
[AccountType] [nchar](10) NOT NULL,
[OpenedDate] [datetime] NULL,
[Status] [nchar](10) NULL,
[AccountOwnerID] [int] NULL,
CONSTRAINT [PK_BankAccount] PRIMARY KEY CLUSTERED
(
[BankAccountID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
工厂如下所示
public class MySimpleBankAccountFactory : IBankAccountFactory
public DomainEntitiesForBank.IBankAccount CreateAccount(string accountType, int bankAccountID, string status, System.Nullable<System.DateTime> openedDate, System.Nullable<int> accountOwnerID)
DomainEntitiesForBank.IBankAccount acc = null;
if (System.String.Equals(accountType, "Fixed"))
acc = new DomainEntitiesForBank.FixedBankAccount();
acc.BankAccountID = bankAccountID;
acc.AccountStatus = status;
if (System.String.Equals(accountType, "Savings"))
acc = new DomainEntitiesForBank.SavingsBankAccount();
acc.BankAccountID = bankAccountID;
acc.AccountStatus = status;
return acc;
阅读
Entity classes decoupled from LINQ to SQL provider for implementing the Repository pattern. How?
使用 POCO LINQ to SQL 实体 http://stephenwalther.com/archive/2008/07/22/asp-net-tip-23-use-poco-linq-to-sql-entities.aspx
使用 LINQ to SQL XML 映射文件 http://weblogs.asp.net/dwahlin/archive/2008/08/18/using-linq-to-sql-xml-mapping-files-step-by-step.aspx
如何:创建使用 POCO 定义的实体的域服务 http://msdn.microsoft.com/en-us/library/gg602754(v=vs.91).aspx
【问题讨论】:
您的意思是要使用 POCO 类吗?实体框架支持这一点。见***.com/questions/2478081/…。您可以在单独的项目中编写 poco 类的脚本,只需要在脚本时引用物理 edmx 文件。 @Maarten 在 LINQ to SQL 中,我们可以使用 XML 映射文件。仍然只有一个类(1个表 - 1个类)才能进行映射。但它不支持多态性。我需要通过一种机制(比如说,xml 映射)说明接口的派生类是什么。此外,我应该将每条记录映射到基于数据的派生类之一。如何实现? 【参考方案1】:我不确定 Linq-to-Sql 是否支持映射到接口(实体框架不支持,但 NHibernate 支持)。如果您将IBankAccount
替换为抽象类BankAccount
,您应该能够在所有提到的技术中简单地映射TPH 继承。 Here 是 Linq-to-Sql 的示例。
映射继承后,您可以查询基类或特定类(在 Linq-to-Sql 或实体框架中使用 OfType
)。查询基类时,ORM 也会在内部遍历所有继承的类。
【讨论】:
感谢 TPH(按层次结构表)提示...再次感谢您提供如此清晰的参考 [Guy Burstein 的“Linq to SQL Inheritance”]。我会尽快将其标记为已回答。以上是关于使用 ORM 生成的实体作为多态的域对象的主要内容,如果未能解决你的问题,请参考以下文章
ORM篇——使用NHibernate配置对象实体的一些小问题