2012-10-18 37 views
0

我們有一個像Vehicle這樣的實體和三個衍生實體,如CarMotorbikeBicycle。 此繼承層次結構使用TPH實施。實體框架中的條件映射 - 或者與TPH的操作

這裏有實體映射條件:

  • __disc__ = car轎車
  • __disc__ = motorbike爲摩托車
  • __disc__ = bicycle自行車

    我怎樣才能派生另一個孩子從VehicleMotorVehicle與下面粘貼條件:

  • __disc__ = car OR motorbike爲MotorVehicle的

我想在這樣的數據庫視圖,當我有這個結構TPT

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

我認爲這種觀點對於TPH不是必需的。

請注意,我不能改變這樣的繼承:車輛< - MotorVehicle的< - 汽車。不要考慮將汽車注入汽車和其他兒童的父母身上,因爲汽車,摩托車和自行車已經存在。我只想分配一些業務給所有的汽車。

回答

0

爲什麼不能在類層次結構中引入MotorVehicle級別?您可以。它只是一個抽象類,所以它不需要鑑別器值。英孚幾乎沒有注意到這個班!

我試過有和沒有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); 
    } 
} 
+0

你的意思是我實現MotorVehicle的不是在DAL,對不對? 然後,在DAL中沒有汽車,但它是與業務相關的東西,對吧? –

+0

在你的EF模型中。無處。我做了代碼優先。 –

+0

你能否給我更多的細節並提供模型?我無法創建抽象實體。 –