Entity Framework - несколько составов для одного класса - PullRequest
0 голосов
/ 26 февраля 2019

TL; DR

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

Правильное объяснение

Я проектирую некоторый код с использованием Enterprise Architect.UML для заинтересованных классов выглядит следующим образом:

UML

Сгенерированный код на C # имеет вид

public class A
{
    public int id { get; set; }

    public List<B> foo { get; set; }

    public List<B> bar { get; set; }

}

public class B
{
    public int id { get; set; }

    // fields...

}

Отлично!Вот как я этого хочу.Тем не менее, мой первый подход кода Entity Framework (не может быть изменен, он использовался годами в проекте) создает некоторые миграции, которые не совсем такие, какими я бы хотел, чтобы они были.

A - это таблица, содержащая только ееполя (в примере, id).B выглядит следующим образом:

|   id   | field1 | field2 | A_ID1 | A_ID2 |

Ну, это работает, но проблема в том, что в реальном сценарии у меня есть что-то вроде десяти композиций для нескольких классов.Один и тот же экземпляр B не будет когда-либо распределяться между несколькими классами.В результате получается таблица, подобная этой

|   id   | field1 | field2 | A_ID1 | A_ID2 |
|   1    |   ..   |  ..    |   1   | null  |
|   2    |   ..   |  ..    |   2   | null  |
|   2    |   ..   |  ..    |  null |   3   |

Т.е. только один внешний ключ на строку (и я повторяю это, потому что это то, что беспокоит меня больше всего, есть много внешних ключей), не равен нулю, все остальные равны нулю,

Есть ли у вас какие-либо предложения по улучшению этого отображения?Я использую следующие инструменты:

Enterprise Architect <-> Entity Framework <-> EF Code First Migrations

1 Ответ

0 голосов
/ 27 февраля 2019

Кажется, что концептуально у вас есть только одно отношение от A до B.Однако по каждой ссылке вам нужно знать, является ли она foo или bar

. В логической модели данных я, вероятно, смоделирую это так: enter image description here

В базе данных, которая может быть реализована с помощью таблицы ссылок ABProperties, которая имеет внешний ключ для A и B и имеет дополнительный столбец ABType, который содержит Foo илиBar

Добавление уникального ограничения на FK в B должно обеспечить ограничение верхней границы 1, гарантируя, что вы не можете соединить строку B с более чем одним A

Поскольку я не знаком с вашим набором инструментов для генерации кода, я не уверен, поддерживает ли он даже классы ассоциации.

Если ваш набор инструментов не поддерживает классы ассоциации, вы можете установить тип как свойствокласса B.

enter image description here

Это не так чисто, как решение с классом ассоциации, но я думаю, что это будет работать с B может быть только частью одного A

...