У меня есть довольно простой набор таблиц базы данных, например:
Vehicle
Id
RegNo
Car
Id (FK of Vehicle.Id)
OtherStuff
Bike
Id (FK of Vehicle.Id)
MoreStuff
Моя модель класса как и следовало ожидать: автомобиль является абстрактным классом, а затем его подклассами являются автомобиль и велосипед.
Я настроил свою конфигурацию EF4.1 Code First следующим образом:
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, которые смог найти!