2015-09-18 27 views
0

我有一個抽象對象,它有兩個抽象對象列表。該模型正在創建,數據庫看起來很好,但我無法做出我期望的查詢。數據建模和/或在實體框架中查詢TPT模型的問題

數據模型看起來像這樣

public abstract class Vehicle 
{ 
    protected Vehicle() 
    { 
     this.CrashIncidents = new List<Incident>(); 
     this.SpeedingIncidents = new List<Incident>(); 
    } 
    [Key] 
    public int Id { get; set; } 
    public virtual ICollection<Incident> CrashIncidents { get; set; } 
    public virtual ICollection<Incident> SpeedingIncidents { get; set; } 
} 

public class Car : Vehicle 
{ 
    public string Color { get; set; } 
} 

public class Lorry : Vehicle 
{ 
    public int MaxCarryWeight { get; set; } 
} 

public abstract class Incident 
{ 
    [Key] 
    public int Id { get; set; } 
    public virtual ICollection<Incident> VehicleCrashIncidents { get; set; } 
    public virtual ICollection<Incident> VehicleSpeedingIncidents { get; set; } 
} 

public class CrashIncident : Incident 
{ 
    public string Severity { get; set; } 
} 

public class SpeedingIncident : Incident 
{ 
    public string MPHRegistered { get; set; } 
} 

任我在Context類OnModelCreating看起來像這樣

modelBuilder.Entity<Vehicle>().HasMany<Incident>(o => o.CrashIncident).WithMany(a => a.VehicleCrashIncidents).Map(m => m.MapLeftKey("Id").MapRightKey("VehicleCrashIncidentId").ToTable("VehicleCrashIncident")); 
modelBuilder.Entity<Vehicle>().HasMany<Incident>(o => o.SpeedingIncident).WithMany(a => a.VehicleSpeedingIncidents).Map(m => m.MapLeftKey("Id").MapRightKey("VehicleSpeedingIncidentId").ToTable("VehicleSpeedingIncident")); 

modelBuilder.Entity<CrashIncident>().ToTable("CrashIncident"); 
modelBuilder.Entity<SpeedingIncident>().ToTable("SpeedingIncident"); 

但是我不能查詢到的東西,如:獲取所有車輛(或具體類)與嚴重程度爲X的事件ie ie這樣的:

var problems = context.Vehicle.Where(x => x.CrashIncidents.Any(y => y.Severity == "High"); 

問題是查詢的最後部分(在y部分中),我無法選擇嚴重性,只有Abstract類的屬性可見。我無法確定(以及Google)是否問題出在我的數據模型或我的查詢上。

回答

1

受此啓發:

Issue with many-to-many relationship + TPH inhertitance in Entity Framework 6

我得到了這個工作。我刪除了特定的虛擬部分從我的模型是這樣的摘要部分:

public abstract class Vehicle 
{ 
    protected Vehicle() 
    { 
     this.Incidents= new List<Incident>(); 
    } 
    [Key] 
    public int Id { get; set; } 
    public virtual ICollection<Incident> Incidents{ get; set; } 
} 

,改變了導航性能

public abstract class Incident 
{ 
    [Key] 
    public int Id { get; set; } 
    public virtual ICollection<Incident> VehicleIncidents { get; set; } 
} 

在OnModelCreating我可以去掉兩個「modelBuilder.Entity()有許多「線路。最後,我可以執行此查詢:

var problems = context.Vehicle.Where(x => x.Incidents.OfType<CrashIncidents>.Any(y => y.Severity == "High"); 

我必須承認,我不確定我是否嘗試過特定的查詢,所以我不知道這是否是在讓我做我的數據模型的變化該查詢或一直可能的,我只是不知道它。