0

Есть ли способ преформ следующих отображений (с использованием базы данных, первый подход):Entity Framework - Расщепление таблица несколько субъектов с ПЕРЕКРЫТИЕМ СОСТОЯНИЯ

Таблицы: (Определение таблицы с 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; 
} 

Entities:

// 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 таблицы и отображения сущностей на них.
    (Может использовать базовый тип с этим, вместе с таблицей-Per-Бетон-Type.)

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

ответ

0

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

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

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

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

+0

Могут быть общие свойства, такие как «Имя», которые я только что добавил к примеру. Наследование TPH было бы большим, за исключением того, что строка не может быть сопоставлена ​​двум различным производным типам одновременно. Разделение таблицы с условиями невозможно, по крайней мере, не через дизайнера. –

+0

Это больше о "давайте попробуем, и вы увидите". Это непросто. Не все можно сопоставить с EF, как вы хотите. –

+0

Я так и думал, сопоставление новых моделей с существующими схемами без нарушения существующих обычаев может быть сложным. –