Имитация наследования нескольких таблиц в Linq-to-SQL - PullRequest
5 голосов
/ 07 апреля 2011

В настоящее время все знают, что Linq-to-SQL изначально не поддерживает наследование нескольких таблиц (иначе говоря, таблица на подтип) и что вместо этого вы можете использовать другие платформы ORM, такие как Entity Framework, NHibernate и т. Д. вам нужна встроенная поддержка наследования нескольких таблиц (если у вас есть какие-либо сомнения, обратитесь к вопросу SO " Multiple Inheritance в LINQtoSQL ").

Однако, предположив, что вы хотите использовать (или ограничены в использовании) Linq-to-SQL в качестве слоя ORM, кто-нибудь определил простую и понятную стратегию проектирования для имитации нескольких таблиц наследование в проектах Linq-to-SQL, так что клиентский код может быть написан на уровне Linq-to-SQL с использованием естественного объектно-ориентированного API?

1 Ответ

0 голосов
/ 09 декабря 2014

Я думаю, Сэм дал хороший ответ: 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
        }

    }

Для запросов типа "JOIN" я бы подумал о создании собственных деревьев выражений , если мне это действительно нужно, потому что это быстро становится сложным. Метод «Left Outer Join», который вы видите в этом примере by hajirazin , также может быть помещен как «protected» в класс Person и вызываться с правильными значениями из «Customer» и других потомков.

В заключение, я думаю, что вся работа должна быть сделана вручную для симуляции запросов в объектах. Деревья выражений могут делать все, но их сложно завершить.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...