Entity Framework 4.1 Отображение таблицы на тип - PullRequest
0 голосов
/ 06 апреля 2011

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

    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); иЯ смотрю на базу данных, у таблицы для Типа 1 есть правильное поле, но у родительской таблицы "basetypes" также есть поле цены.

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

Есть предложения?

Ответы [ 3 ]

1 голос
/ 06 апреля 2011

По умолчанию код сначала будет использовать наследование TPH (таблица на иерархию). Это означает, что оба ваших типа хранятся в одной таблице с именем «Базовые типы». Вы заметите, что оно также включает дополнительное поле под названием «Дискриминатор». 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; }

}
0 голосов
/ 06 апреля 2011

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

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

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

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

здравомыслие восстановлено .... На данный момент !!!

0 голосов
/ 06 апреля 2011

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

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

}
...