2016-07-05 4 views
2

時々独立しており、クラスで私は親クラスComponentDesignありますEntity Frameworkの一対一の

public class ComponentDesign 
{ 
    public string Name { get; set; } 

    public virtual JobFile DesignFile { get; set; } 
    public int? DesignFileId { get; set; } 

    public Pdf PdfFile { get; set; } 
    public int? PdfFileId { get; set; } 

    public JobFile SealedPdfFile { get; set; } 
    public int? SealedPdfFileId { get; set; } 

    public int Id { get; set; } 

    public int JobId { get; set; } 
} 

そして(Pdfサブクラスとなっている)子クラスJobFile

public class JobFile 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Url { get; set; } 

    public ComponentDesign ComponentDesign { get; set; } 
    public int? ComponentDesignId { get; set; } 

    public int? JobId { get; set; } 
} 

これらのクラスは、Entity Frameworkを使用してリレーショナルデータベースに格納されます。私は関係の両側にナビゲーションプロパティを持ちたいので、componentDesign.PdfFileまたはjobFile.ComponentDesignとすることができます。

ComponentDesignにおけるタイプJobFileの各プロパティはオプションであり、JobFile will only ever belong to one ComponentDesign . However, a JobFile may be free-standing, not belonging to any ComponentDesign (so jobFile.ComponentDesign`はヌルであろう。

私はFluent APIを使用してこの関係を設定する方法に苦しんでいます。それは1対1です。関係の両側にナビゲーションプロパティを持たせることは可能ですか? JobFileは自立している可能性があるので(jobFile.ComponentDesignは必ずしも関連するとは限りません)、JobFileComponentDesignに属しています。私は私が来ていると感じ最も近いがこれです:

modelBuilder.Entity<ComponentDesign>() 
      .HasOptional(componentDesign => componentDesign.DesignFile) 
      .WithRequired(jobFile => jobFile.ComponentDesign); 

しかし、これはjobFile.ComponentDesignは必ずしもそうではありませんこれは、必要とされていることを示すために私には思えます。私はいくつかのかなりの移行を生成するので、それを試してみることを躊躇しているので、私は入力を最初に取得したい。この状況で私のFluent APIの設定はどのように見えるのですか? >JobFile =オプション -

ComponentDesign:私は関係を理解ちょうどそのよう

+0

2つのオブジェクトクラスの間でEntity Frameworkでリレーションシップを作成するには、データ型と言うと、クラスワードでバーチャルワードを使用できます。私はあなたの問題の仮想プロパティで結果を見つけることができると確信しています。 –

答えて

2

JobFile - >ComponentDesign =オプションです。

ゼロ/ 1から0または1([0/1] - [0/1])の関係です。

これは、流暢なAPIの.WithOptionalPrincipalメソッドを使用して次のように実装できます。 1-0の関係では、どのエンドが主要エンドであるかは明らかです。 1-∞の関係でも同じです。 ∞-∞の関係は、それぞれの間の関係を制御する隠しテーブルが作成されているため、主な目的がありません。 0/1-0/1、または1-1の関係では、それは明白ではないので、関係の主要な終点として使用するデータベースを指定する必要があります。他の多くのものの中でも、テーブル間の関係を開始し、維持する責任があります。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // Configure ComponentDesign & JobFile entity 
    modelBuilder.Entity<ComponentDesign>() 

     // Mark JobFile property optional in ComponentDesign entity. 
     .HasOptional(cd => cd.DesignFile) 

     // Mark ComponentDesign property optional in JobFile entity. 
     .WithOptionalPrincipal(jf => jf.ComponentDesign); 
} 

それとも、あなたはを通してソートするがたくさんある場合は、関係を分離するエンティティごとにEntityTypeConfiguration<>クラスを作成することができます。これは関係を分散化しますが、スケーラビリティは高くなります。コンテキストが一度設定されると、MEFを介してこれらの設定クラスを注入できるからです。将来の発展のための単なるアイデアです。

.WithOptionalPrincipalの代わりにナビゲーションを正しく設定するために、JobFileの最後からリレーションシップを設定する場合は、.WithOptionalDependentを使用します。それは関係を設定する側によって異なります。ComponentDesignエンティティは、JobFileエンティティに、JobFileエンティティがComponentDesignエンティティに依存するよりも多くのことに依存します。したがって、プリンシパルとして設定する必要があります。

上記のコメントのいずれかに記載されているように、複雑なプロパティはvirtualキーワードで飾ります。この遅延はプロパティをロードし、クラスがインセンティブを受けたときに初期値をnullに設定します。

データベースをテストサーバーに複製して、この1つの問題を処理してから、実動モデルに変更を実装します。そうすれば、データベースを移行する際にデータが失われることはありません。

関連する問題