Наследование TPH EntityFramework и база данных внешних ключей в первую очередь - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть структура БД с 2 таблицами: Order и Lines. У заказа может быть несколько строк.

enter image description here

Из соображений производительности я хочу иметь отдельную бизнес-модель для моих линий, чтобы иметь возможность управлять объектами освещения (Шаблон TPH):

public class Order
    {
        public int id { get; set; }
        public ICollection<BasicLine> Lines { get; set; }
    }

    public abstract class BasicLine
    {
        public int id { get; set; }
        public int idOrder { get; set; }
    }

    public class LineFull: BasicLine
    {
        public string property1 { get; set; }
        public string property2 { get; set; }
        public string property3 { get; set; }
        public string property4 { get; set; }
    }

    public class LineLight: BasicLine
    {
        public string property4 { get; set; }
    }

И конфигурация модели:

 public class BasicLineModelConfiguration : BaseEntityModelConfiguration<BasicLine>
    {
        public BasicLineModelConfiguration()
        {
            var discriminator = nameof(BasicLine.LineType);
            Map<LineLight>(c => c.Requires(discriminator).HasValue((int)BasicLine.LineType.LineLight));
            Map<LineFull>(c => c.Requires(discriminator).HasValue((int)BasicLine.LineType.LineFull));


            ToTable("tbl_Line");
        }
    }

    public class LineFullModelConfiguration : BaseEntityModelConfiguration<LineFull>
    {
        public LineFullModelConfiguration()
        {

        }
    }

    public class LineLightModelConfiguration : BaseEntityModelConfiguration<LineLight>
    {
        public LineLightModelConfiguration()
        {

        }
    }

    public class OrderModelConfiguration : BaseEntityModelConfiguration<Order>
    {
        public OrderModelConfiguration()
        {
            ToTable("Order");

            HasMany(m => m.Lines)
            .WithRequired(m => m.Order)
            .HasForeignKey(m => m.idOrder);
        }
    }

Я также добавил 4 из них в контекст.

Мне нужно, чтобы мой Заказ имеет несколько полных строк со всеми доступными свойствами. Я не думаю, что создание Icollection BasicLines достигнет моей цели, потому что я не могу получить доступ к свойствам LineFull. Но если я установил ICollection LineFull, у меня будет эта ошибка:

Компонент внешнего ключа 'idOrder' не является объявленным свойством для типа 'LineFull'. Убедитесь, что он не был явно исключен из модели и является допустимым примитивным свойством

Я не хочу, чтобы мой LineLight имел полный объект Order в ссылке (я хочу, чтобы он был очень легким)

Я думаю, что у меня проблема с моей структурой, но я много чего перепробовал, но ничего не получалось. (Меня не удивляет вопрос о дискриминаторе, должен ли он быть полем в БД или нет)

спасибо за вашу помощь.

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