Entity Framework - Разделение таблицы на несколько объектов с ПЕРЕКРЫТЫМ УСЛОВИЕМ - PullRequest
0 голосов
/ 27 апреля 2011

Есть ли способ предварительно сформировать следующие отображения (используя подход, основанный на базе данных) :

Таблицы: (Определение таблиц с C # -подобным синтаксисом только для удобства чтения)

table MainItems
{
    column PK not-null unique int MainItemKey;
    column string Name;
    column string AspectAInfo;
    column string AspectBInfo;

    // 0 for A, 1 for B, 2 for both (Could be replaced with 2 boolean columns)
    column not-null int AspectABOrBoth;
}

table AspectAMoreInfo
{
    column PK not-null unique in AspectAMoreInfoKey;
    column FK not-null int MainItemKey;
    column string PayLoadA;
}

table AspectBMoreInfo
{
    column PK not-null unique in AspectBMoreInfoKey;
    column FK not-null int MainItemKey;
    column double PayLoadB;
}

Объекты:

// Map to MainItems table if column AspectABOrBoth is 0 or 2
class TypeAItem
{
    // Map to MainItemKey column
    int TypeAItemKey { get; set; }

    string Name { get; set; } // Map to Name column

    // Navigation property to AspectAMoreInfo rows
    List<TypeAMoreInfo> MoreInfo { get; set; }

    // Navigation property to MainItems row when AspectABOrBoth is 2
    TypeBItem OptionalInnerItemB { get; set; }
}

// Map to MainItems table if column AspectABOrBoth is 1 or 2
class TypeBItem
{
    // Map to MainItemKey column
    int TypeBItemKey { get; set; }

    string Name { get; set; } // Map to Name column

    // Navigation property to AspectBMoreInfo rows
    List<TypeBMoreInfo> MoreInfo { get; set; }
}

// Map to AspectAMoreInfo table
class TypeAMoreInfo
{
    // Map to AspectAMoreInfoKey column
    int TypeAMoreInfoKey { get; set; }

    // Navigation property to MainItems row when MainItems.AspectABOrBoth is 0 or 2
    TypeAItem Owner { get; set; }
}

// Map to AspectBMoreInfo table
class TypeBMoreInfo
{
    // Map to AspectBMoreInfoKey column
    int TypeBMoreInfoKey { get; set; }

    // Navigation property to MainItems row when MainItems.AspectABOrBoth is 1 or 2
    TypeBItem Owner { get; set; }
}

Возможные направления, которые я рассмотрел, но предпочитаю не принимать, включают:

  1. Определение 2 представлений над таблицей MainItems и сопоставление сущностей с ними.
    (Может использовать базовый тип с этим вместе с табличным типом бетона.)

  2. Добавление 2 обнуляемых столбцов FK в таблицу MainItems, которые указывают на себя (на ту же строку) вместо столбца AspectABOrBoth
    (1 not-null, если MainItem - AspectA, другой not-null, если MainItem - AspectB.)
    (С этим можно использовать разбиение таблицы на основе новых столбцов FK.)

1 Ответ

0 голосов
/ 27 апреля 2011

Разделение таблицы на несколько объектов возможно при использовании:

  • Разделение таблицы - требуется, чтобы объект разделял только ключ, а каждое другое свойство можно было сопоставить только одному объекту.
  • Наследование TPH - требует, чтобы базовая сущность определяла ключевые и общие свойства. Подсубъекты могут содержать другие свойства, но свойства не могут быть общими для подпринципов. Таблица должна содержать один или несколько специальных столбцов (дикриминаторы), которые будут определять, какой тип в иерархии наследования представляет запись. MSL не допускает никаких сложных выражений для дискриминатора . Сложное условие может быть создано только как логическое И всех условий.

Если я посмотрю на ваши таблицы, это не будет похоже на наследование. TableAItem и TableBItem не имеют общих свойств. Единственный общий элемент - это, вероятно, ключ, который делает остальную часть вашего дизайна довольно сложной, поскольку отношение как к TableAMoreInfo, так и к TableBMoreInfo будет создаваться с помощью MainItem (держатель ключа), а не дочерних элементов.

Представления выглядят более подходящими для решения этой проблемы, но представление по умолчанию доступно только для чтения в EF, если вы не измените SSDL вручную.

...