在Linq-to-SQL中模拟多表继承

KP *_*lor 5 .net multiple-inheritance linq-to-sql

到目前为止,每个人都知道Linq-to-SQL本身不支持多表继承(又称table-per-subtype),并且你可以使用其他ORM框架,如Entity Framework,NHibernate等,如果你想要原生的话支持多表继承(如果您有任何疑问,请参考SO问题" LINQtoSQL中的多重继承 ").

但是,假设您确实想要使用(或仅限于使用)Linq-to-SQL作为您的ORM层,那么任何人都可以确定一个简单而直接的设计策略来模拟 Linq-to-SQL项目中的多表继承,以便客户端代码可以使用自然的,面向对象的API针对Linq-to-SQL层编写?

Elo*_*Elo 0

我认为Sam的答案很好:Linq2Sql似乎无法做到这一点。但只要你只是想模拟这种行为,我就会这样做:

      /// <summary>
    /// Declare POCO (Plain Old CLR Object) as you would to manipulate your inheritance
    /// </summary>
    public class Person
    {
        public abstract void Load();
        public abstract void Save();
    }

    /// <summary>
    /// Simulate a consistent behavior
    /// </summary>
    public class Customer : Person
    {

        public override void Load()
        {
            // - Do some Linq2Sql stuff
        }

        public override void Save()
        {
            // - Do some Linq2Sql stuff
        }

    }
Run Code Online (Sandbox Code Playgroud)

对于像“JOIN”这样的查询,我会考虑生成自己的表达式树,如果我真的需要它,因为这很快就会变得棘手。您在hajirazin示例中看到的“Left Outer Join”方法也可以放在 Person 类中“受保护”,并使用来自“Customer”和其他子级的正确值进行调用。

总之,我认为所有的工作都必须手动完成才能模拟对象中的请求。表达式树可以做一切事情,但很难最终确定。

此致,