0

のようなエンティティと、 、 、Vehicleなどの 3 つの派生エンティティがあります。この継承階層はTPHで実装されます。CarMotorbikeBicycle

エンティティ マッピング条件は次のとおりです。

  • __disc__ = car車用
  • __disc__ = motorbikeバイク用
  • __disc__ = bicycle自転車用

    次のマッピング条件を使用してVehiclelikeから別の子を派生させるにはどうすればよいですか。MotorVehicle

  • __disc__ = car OR motorbike自動車用

TPTでこの構造を持っていたときに、次のようにデータベースで表示します。

SELECT    Id
FROM      Vehicles
WHERE     (__Disc__ = N'car') OR (__Disc__ = N'motorbike')

TPH では、このビューは必要ないと思います。

次のように継承を変更できないことに注意してください: Vehicle<-- MotorVehicle<-- Car. Car と Motorbike と Bicycle は既に存在するため、自動車を car と他の子の親として注入することを考えないでください。すべての自動車に何らかのビジネスを割り当てたいだけです。

4

1 に答える 1

0

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);
    }
}
于 2012-10-18T23:41:22.710 に答える