2017-07-04 103 views
0

當我的數據層從Telerik遷移到EF6時,我有POCO 命名問題EF模型是從現有數據庫生成的「代碼優先」。因爲我不想更改業務層,所有遷移/配置都需要在數據層完成。我還嘗試保持EF數據庫的代碼生成不變,以便將來維護,同時使用部分類保持原有代碼不變。EF6(代碼優先)單個外鍵屬性上的多個導航屬性

所以EF產生POCO的一個FK參考這樣的:

public partial class MyPoco 
{ 
     public Guid? MyForeignKeyDatabasePocoId { get; set; } /* Foreign key database column */ 

     public virtual MyForeignKeyDatabasePoco { get; set; } /* Navigation property MyForeignKeyDatabasePocoId database column */ 
} 

此作品開箱,因爲命名約定是正確的(產生的) 但現在我想添加一個基於導航屬性同一個數據庫FK ID(在業務層使用),

public partial class MyPoco 
{ 

     [ForeignKey("MyForeignKeyApplicationPoco", "MyForeignKeyDatabasePocoId")] /* <- not possible, no constructor accepts two parms */ 
     public Guid? MyForeignKeyDatabasePocoId { get; set; } /* Foreign key database column */ 

     public virtual MyForeignKeyDatabasePoco {get; set; } /* Navigation property FK MyForeignKeyDatabasePocoId database column */ 

     public virtual MyForeignKeyApplicationPoco {get; set; } /* Navigation property FK MyForeignKeyDatabasePocoId database column */ 
} 

我試着用[ForeignKey的(「MyForeignKeyApp裝飾Id屬性licationPoco「)],但它抱怨說」MyForeignKeyDatabasePoco「沒有(外鍵)鍵。我無法將兩個外鍵裝飾器設置爲id屬性。

MyForeignKeyDatabasePoco和MyForeignKeyApplicationPoco是相似的,它們都存在於模型中。

A)這可能嗎? B)當實體MyPoco被定義時(或者兩個或兩個fk poco的),我應該改變OnModelCreating(DbModelBuilder modelBuilder)中的某些東西嗎? C)我應該剛剛擺脫生成的導航財產有利於傳統的業務財產(不是首選選項順便說一句)

任何幫助將不勝感激。布迪後

編輯評論

與繼承解決它。第一數據庫POCO抽象然後應用程序從POCO然後數據庫POCO

public abstract partial class MyForeignKeyDatabasePoco 
{ 
    /* EF generated code */ 
} 

public partial class MyForeignKeyApplicationPoco : MyForeignKeyDatabasePoco 
{ 
    /* additional things todo */ 
} 

public partial class MyPoco 
{ 
     public Guid? MyForeignKeyDatabasePocoId { get; set; } /* Foreign key database column */ 

     public virtual MyForeignKeyApplicationPoco { get; set; } /* Navigation property to MyForeignKeyDatabasePocoId database column */ 
} 

繼承在流利模型DbSet < MyForeignKeyApplicationPoco>被添加並在流利OnModelCreating(DbModelBuilder模型構建器)modelBuilder.Entity < MyForeignKeyApplicationPoco> ();添加了

回答

1

其實我認爲如果你不用外鍵字段名稱添加一個屬性,就不可能使用屬性。在這種情況下,您可以使用ForeignKey屬性將該屬性設置爲外鍵。

否則,你可以使用流利的配置(通常我用這種方式)。

modelBuilder.Entity<OfficeAssignment>() 
     .HasRequired(t => t.PianoDiRientro) 
     .WithMany(t => t.Rates) 
     .Map(d => d.MapKey("IdPianoDiRientro")); 

在這種情況下是一對多的關係(一個PianoDiRientro許多Rates)和外鍵列名是IdPianoDiRientro

+0

我想你是對的。不可能使用屬性。我用繼承來解決它。使數據庫 - poco抽象和應用程序 - poco繼承數據庫 - poco。不是我理想的解決方案,但它似乎工作。 – Lextendo

相關問題