2017-07-04 21 views
0

TelerikからEF6へのデータレイヤーの移行時に、POCO という名前の問題がありました。 EFモデルは、既存のデータベースから生成された「コードファースト」です。私はビジネス層を変更したくないので、すべての移行/設定をデータ層で行う必要があります。私はまた、レガシーコードをそのまま維持するための部分的なクラスを使用しながら、EFデータベースからのコード生成を将来のメンテナンスのために変更しないようにしています。EF6(コードファースト)単一の外部キープロパティの複数のnavプロパティ

だから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 */ 
} 

命名規則が正しい(生成) あるので、これは、箱から出して動作します。しかし、今、私はに基づいて、ナビゲーションプロパティを追加したいです私は[ForeignKeyの(「MyForeignKeyAppとIDプロパティを装飾しようとした(ビジネスレイヤで使用される)同じデータベース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 */ 
} 

licationPoco ")]しかし、それは" MyForeignKeyDatabasePoco "が(外国語)キーを持っていないと文句を言う。 idプロパティに2つの外部デコレータを設定することはできません。

MyForeignKeyDatabasePocoとMyForeignKeyApplicationPocoはsimularです。両方ともモデルに存在します。

)これは可能ですか? B)エンティティMyPocoが定義されている場合(またはfk pocoのいずれかまたは両方)、OnModelCreating(DbModelBuilder modelBuilder)で何かを変更する必要がありますか? C)既存のビジネスプロパティを優先して生成されたnavプロパティを取り除くだけでよいでしょうか(好ましいオプションbtwではありません)

ご協力いただければ幸いです。

編集bubiは

をコメントした後、継承とそれを解決しました。最初のデータベースPOCOを抽象化し、アプリケーション・POCOはDbSetは流動モデルでデータベース・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 */ 
} 

から継承< MyForeignKeyApplicationPoco>が追加され、流動OnModelCreating(DbModelBuilder ModelBuilderの)で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

関連する問題