Entity Framework 4.1 Сопоставление таблиц по типам

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

    public class BaseType
{
    [Key]
    public int id { get; set; }
    public string description { get; set; }
}
public class Type1 : BaseType
{
    public decimal price { get; set; }

}
public class mycontext : DbContext 
{
    public DbSet<BaseType> basetypes { get; set; }
    public DbSet<Type1> type1 { get; set; }

}

когда я запускаю приложение и создаю объект Type1 и использую mycontext.type1.ADD(mytype1object);, и я просматриваю базу данных, таблица для Type one имеет правильное поле, но родительская таблица «basetypes» также имеет поле цены.

Должен ли я явно игнорировать поле?

Какие-либо предложения?


person KidCoke    schedule 05.04.2011    source источник


Ответы (3)


По умолчанию код сначала будет использовать наследование TPH (Table Per Hierarchy). Это означает, что оба ваших типа хранятся в одной таблице под названием «BaseTypes». Вы заметите, что он также включает дополнительное поле под названием «Дискриминатор». EF сохранит значение в этом поле, чтобы указать тип каждой записи.

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

[Table("BaseTypes")]
public class BaseType
{
    [Key]
    public int id { get; set; }
    public string description { get; set; }
}

[Table("Type1s")]
public class Type1 : BaseType
{
    public decimal price { get; set; }

}
person ckal    schedule 06.04.2011

Я не могу воспроизвести вашу проблему - на самом деле, если я использую ту же модель с EF 4.1, сгенерированная БД только имеет таблицу BaseTypes, которая содержит оба элемента BaseType и Type1 - строки с элементами BaseType просто имеют нулевое значение в качестве цены. Итак, в настоящее время вы используете не TPT, а TPH. Чтобы переключиться на TPT, вы можете аннотировать свой класс Type1 или использовать свободный API:

[Table("Type1s")]
public class Type1 : BaseType
{
    public decimal price { get; set; }

}
person BrokenGlass    schedule 06.04.2011

Спасибо за вклад BrokenGlass и ckal. Я привязывал к пользователю аннотацию «Таблица (имя)» и свободный API, выполнял все шаги и продолжал получать таблицу как для BaseTypes, так и для Type1, а таблица BaseTypes содержала поля для полей в Type1.

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

Я не уверен, было ли это случайностью или я нашел ошибку, но теперь все работает.

Еще раз спасибо за быстрые ответы.

Здравомыслие восстановлено.... Пока!!!

person KidCoke    schedule 06.04.2011