У меня довольно простой набор таблиц базы данных, например:
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, которые я могу найти!