Ошибка Entity Framework 6 Table per Hierarchy (TPH)

Я создал абстрактный класс с некоторыми базовыми свойствами:

public abstract class BaseModel
{
    public BaseWishModel()
    {
    }

    [Key]
    public int Id { get; set; }

    public virtual string Title { get; set; }

    public bool IsPublished { get; set; }
    public bool IsSpam { get; set; }
}

Мой класс предметов:

public class PrivateItem : BaseModel
{
    [NotMapped]
    public string PurposesIds { get; set; }
}

Мой метод OnModelCreating:

  modelBuilder.Entity<BaseModel>()
             .Map<PrivateItem>(r => r.Requires("Discriminator").HasValue((int)Enums.Type.Private))
             .ToTable("Items");

Когда я сохраняю данные, он генерирует следующий sql:

INSERT [dbo].[Items]([Title], [IsPublished], [ShortDescription1], [ShortDescription2], [Discriminator])

Я не знаю, почему он генерирует ShortDescription1 и ShortDescription1.


person Arnold    schedule 23.07.2014    source источник
comment
Да. это отображение `modelBuilder.Entity‹BaseModel›() .Map‹PrivateItem›(r =› r.Requires(Discriminator).HasValue((int)Enums.Type.Private)) .Map‹PublicItem›(r =› r.Requires(Discriminator).HasValue((int)Enums.Type.Public)) .Map‹OtherItem›(r => r.Requires(Discriminator).HasValue((int)Enums.Type.Other)) .ToTable( Пункт); ` Я отправляю только одну вставку с определенным классом. Почему это происходит?   -  person Arnold    schedule 23.07.2014
comment
Stack Overflow позволяет вам обновлять свой вопрос столько раз, сколько вы хотите. Пожалуйста, обновите свой вопрос соответствующим кодом, чтобы другим, кто читает ваш вопрос, не приходилось читать каждый комментарий, чтобы понять весь вопрос (и позволяет форматировать код для удобства чтения).   -  person Erik Philips    schedule 23.07.2014


Ответы (1)


Поскольку, согласно вашему комментарию, у вас есть другие классы, наследуемые от BaseModel, и без какой-либо другой конфигурации от вас, EF использует TPH по умолчанию.

В основном это приводит к единой таблице для всей иерархии классов.

Поскольку все классы иерархии сохраняются в одной и той же таблице, когда выполняется вставка для одного класса, все столбцы (иерархии) заполняются. Неиспользуемые столбцы класса заполняются нулевым значением или значением по умолчанию.

Это принесет ShortDescription1 и ShortDescription2 в ваш запрос на вставку.

person tschmit007    schedule 23.07.2014
comment
Я пытаюсь указать все свои классы на одну и ту же таблицу. в соответствии с руководством по структуре сущностей я могу создать дискриминатор, чтобы различать классы, сопоставленные с одной и той же таблицей - person Arnold; 23.07.2014
comment
Извините за путаницу, но я уже создал свойство Discriminator и все равно получаю сообщение об ошибке - person Arnold; 23.07.2014
comment
Можете ли вы привести пример правильной реализации моего запроса? - person Arnold; 24.07.2014