使用ORM生成的实体作为多态性的域对象

时间:2012-07-02 07:13:56

标签: c# .net entity-framework nhibernate linq-to-sql

我们需要从下面列出的表中生成以下域类模型。是否可以使用Linq 2 SQL实现它。如果不可能,实体框架会帮助吗?你能解释一下怎么做吗?

注意:How to Implement Repository FindAll() Method?中提供了域类的代码。那里也有映射示例。

注意:我试图避免Linq 2 SQL生成的实体和域类之间的映射。

编辑:“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]

enter image description here

工厂如下所列

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;
    }
}

阅读

  1. Entity classes decoupled from LINQ to SQL provider for implementing the Repository pattern. How?

  2. 使用POCO LINQ to SQL实体 http://stephenwalther.com/archive/2008/07/22/asp-net-tip-23-use-poco-linq-to-sql-entities.aspx

  3. 使用LINQ to SQL XML映射文件 http://weblogs.asp.net/dwahlin/archive/2008/08/18/using-linq-to-sql-xml-mapping-files-step-by-step.aspx

  4. 如何:创建使用POCO定义的实体的域服务 http://msdn.microsoft.com/en-us/library/gg602754(v=vs.91).aspx


1 个答案:

答案 0 :(得分:1)

我不确定Linq-to-Sql是否支持映射到接口(实体框架不支持NHibernate)。如果用抽象类IBankAccount替换BankAccount,您应该能够在所有提到的技术中简单地映射TPH继承。 Here是Linq-to-Sql的示例。

一旦映射了继承,就可以查询基类或特定类(在Linq-to-Sql或Entity Framework中使用OfType)。查询基类时,ORM将在内部遍历所有继承的类。