Условное сопоставление в Entity Framework - ИЛИ операция с TPH
У нас есть такой объект, как Vehicle
и три производных объекта, такие как Car
, Motorbike
а также Bicycle
, Эта иерархия наследования реализована с помощью TPH.
Вот условия отображения сущности:
__disc__ = car
для автомобиля__disc__ = motorbike
для мотоцикла__disc__ = bicycle
для велосипедаКак я могу родить другого ребенка от
Vehicle
лайкMotorVehicle
со следующим условием отображения:__disc__ = car OR motorbike
для автомобилей
Я бы посмотрел в базе данных, как это, когда у меня была эта структура с TPT:
SELECT Id
FROM Vehicles
WHERE (__Disc__ = N'car') OR (__Disc__ = N'motorbike')
Я думаю, что эта точка зрения не требуется с TPH.
Обратите внимание, что я не могу изменить наследство следующим образом: Автомобиль<- MotorVehicle <- Автомобиль. Не думайте о том, чтобы впрыскивать автомобили в качестве родителя автомобиля и других детей, потому что автомобиль, мотоцикл и велосипед уже существуют. Я просто хочу назначить какое-то дело на все автомобили.
1 ответ
Почему вы не могли представить MotorVehicle
уровень в иерархии классов? Вы можете. Это просто абстрактный класс, поэтому ему не нужно значение дискриминатора. EF едва замечает класс!
Я пробовал как с, так и без MotorVehicle
класс и структура базы данных, а также число определенных дискриминаторов были одинаковыми в обоих случаях.
редактировать
Вот что я сделал:
public abstract class Vehicle
{
public int Id { get; set; }
public string Name { get; set; }
}
public abstract class MotorVehicle : Vehicle
{
public int Hp { get; set; }
}
public class Car : MotorVehicle
{ }
public class MotorBike : MotorVehicle
{ }
public class Bicycle : Vehicle
{ }
internal class NestedInheritanceContext : DbContext
{
public DbSet<Vehicle> Vehicles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Vehicle>().Property(v => v.Name).IsRequired();
modelBuilder.Entity<Car>().Map(m => m.Requires("Discriminator")
.HasValue("car").HasColumnType("char")
.HasMaxLength(10)
.IsRequired());
modelBuilder.Entity<MotorBike>().Map(m => m.Requires("Discriminator")
.HasValue("motorbike"));
modelBuilder.Entity<Bicycle>().Map(m => m.Requires("Discriminator")
.HasValue("bicycle"));
base.OnModelCreating(modelBuilder);
}
}