Наследование таблиц типов с помощью EF 4.1 Fluent Code First - PullRequest
8 голосов
/ 30 июня 2011

У меня довольно простой набор таблиц базы данных, например:

Vehicle
 Id
 RegNo

Car
 Id (FK of Vehicle.Id)
 OtherStuff

Bike
 Id (FK of Vehicle.Id)
 MoreStuff

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

Я настроил свою первую конфигурацию EF4.1 Code следующим образом:

class VehicleConfiguration : EntityTypeConfiguration<Vehicle> {
    public VehicleConfiguration() {
        ToTable("Vehicles");
        Property(x => x.Id);
        Property(x => x.RegNo);
        HasKey(x => x.Id);
    }
}

class CarConfiguration : EntityTypeConfiguration<Car> {
    public CarConfiguration() {
        ToTable("Cars");
        Property(x => x.OtherStuff);
    }
}

class BikeConfiguration : EntityTypeConfiguration<Bike> {
    public BikeConfiguration() {
        ToTable("Bikes");
        Property(x => x.MoreStuff);
    }
}

Однако я получаю множество странных исключений, когда EF пытается построить конфигурацию своей модели.

В настоящее время он выбрасывает это:

System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.

Откуда он берет имя этого столбца? Его нет ни в моем коде, ни в самой базе данных. Это должно быть какое-то соглашение, которое берет на себя контроль. Как мне указать EF использовать таблицу для каждого типа?

Если я удалю ключевое слово "abstract" из своего класса Vehicle (что я и сделал в качестве теста на работоспособность где-то вдоль линии), то получу другое исключение, подобное следующему:

(35,10) : error 3032: Problem in mapping fragments starting at lines 30, 35:EntityTypes AcmeCorp.Car, AcmeCorp.Bike are being mapped to the same rows in table Vehicles. Mapping conditions can be used to distinguish the rows that these types are mapped to.

Я явно делаю что-то ужасно неправильное, но что? Я следил за документами MSDN и всеми другими статьями TPT + EF4.1, которые я могу найти!

Ответы [ 2 ]

8 голосов
/ 21 октября 2013

Когда у меня возникла эта проблема, я обнаружил, что у меня есть подкласс, который не был отображен.В этом примере некоторые возможные причины этого:

  1. Существует дополнительный подкласс, такой как Bus.Это не сопоставлено.
  2. Один из подклассов, например Car, не сопоставлен.

В этом случае убедитесь, что сопоставлен каждый подкласс:

  1. Убедитесь, что сопоставление существует для подкласса, включая вызов метода ToTable.
  2. Убедитесь, что сопоставление действительно применяется во время OnModelCreating.
  3. Если у вас есть проблемы с отслеживаниемпопробуйте использовать отладчик и установить точки останова во всем коде сопоставления.

В качестве альтернативы, если подкласс не должен отображаться в первую очередь, убедитесь, что он игнорируется с помощью одного изIgnore вызовы методов.

8 голосов
/ 30 июля 2011

Вы читали следующую статью?

Это статья из трех частей, охватывающая следующие подходы

  1. Таблица на иерархию (TPH): Включить полиморфизм путем денормализации схемы SQL и использовать столбец дискриминатора типов, содержащий информацию о типе.

  2. Таблица на тип (TPT): Представляет отношения "есть" (наследование) как отношения "имеет" (внешний ключ).

  3. Таблица для конкретного класса (TPC): Полностью отбросить полиморфизм и отношения наследования из схемы SQL.

...