2016-03-09 27 views
0
public virtual DbSet<DBVolumetricObject> Volumetrics { get; set; } //this make error 

我有以下型號實體框架 - 國外關鍵部件是不是類型聲明的屬性

public abstract class DBVolumetricObject 
{ 
    public int Id { get; set; } 
    public int Design_Id { get; set; } 
} 

public class Material : DBVolumetricObject 
{ 
    public virtual MaterialDesign MaterialDesign { get; set; } 
} 

public class MaterialDesign : IDBDesign 
{ 
    ... 
    public virtual List<Material> Materials { get; set; } 
} 

及配置:

public class MaterialConfiguration : EntityTypeConfiguration<Material> 
{ 
    public MaterialConfiguration() 
    { 
     Map(m => m.MapInheritedProperties()); 

     HasRequired<MaterialDesign>(x => x.MaterialDesign) 
      .WithMany(x => x.Materials) 
      .HasForeignKey(x => x.Design_Id); 
    } 
} 

當我嘗試通過初始化數據庫包管理器控制檯中的update-database命令出現以下錯誤。

外鍵組件'Design_Id'不是 類型'Material'的聲明屬性。驗證它沒有被明確地從 模型中排除,並且它是一個有效的原始屬性。

+0

爲什麼在不同的班級Design_Id和質感設計的屬性?你想用這種方式做什麼? –

+0

2表格:根據此設計創建的一些設計和許多材質 – GLeBaTi

+0

嘗試將Design_Id移動到Material或MaterialDesign到DBVolumetricObject。我不認爲你可以將FK和導航屬性分成基類和派生類。 –

回答

2

我做了一些測試來驗證我的評論,它的工作。

你的問題是你有你的FK - Design_Id - 在基類中定義,並且這個設計的導航屬性在派生類中定義。通過這種方式,可以讓FK Design_Id被錯誤地映射,並允許將它用作多個表的FK。爲了防止這些問題,實體框架告訴你:把你的FK屬性和導航屬性放到同一個類中。否則,它將無法正常工作。

所以解決方案就是讓你的階級結構是這樣的:

public abstract class DBVolumetricObject 
{ 
    public int Id { get; set; } 
} 

public class Material : DBVolumetricObject 
{ 
    public int Design_Id { get; set; } 
    public virtual MaterialDesign MaterialDesign{ get; set; }  
} 

public class MaterialDesign : IDBDesign 
{ 
    ... 
    public virtual List<Material> Materials { get; set; } 
}