2017-06-07 9 views
0

エンティティフレームワーク6のコードで最初に作成する必要がある場合、クラスから複数の外部キーを作成する際に問題があります。私は更新データベースコマンド、それはをWorkId作業テーブル用の3種類の外部キーを作成し、マイドキュメントの表に、Work_Id1最初のコードを実行するとC#エンティティフレームワーク - 複数の外部キー

public class Work 
{ 
    public Work() 
    { 
     Document1 = new Collection<Document>(); 
     Document2 = new Collection<Document>(); 
     Document3 = new Collection<Document>(); 
    } 
    [Key] 
    public int WorkId { get; set; } 
    public virtual ICollection<Document> Document1 { get; set; } 
    public virtual ICollection<Document> Document2 { get; set; } 
    public virtual ICollection<Document> Document3 { get; set; } 
} 

public class Document 
{ 
    public int? WorkId { get; set; } 
    [ForeignKey("WorkId")] 
    public Work Work { get; set; } 
} 

- 私は2つのクラスを持って考えてみましょうWork_Id2、これは3つではなく1つの外部キーでなければなりません。これを修正するための簡単な注釈や、追加する必要のある流暢なマッピングがあるはずです。

+0

'Work'は、Document1、Document2、Document3という3つのプロパティ(コレクション)によって' Document'に接続されます。それはなぜ3つの外部キーを作成しているのですか? 1つの外部キーのみを指定したい場合は、他の2つがDocumentエンティティにどのように接続されるかを指定します。 –

答えて

0

明らかにWorkは、ゼロ以上の値を持つことがあります。Document1 0以上Document2 0以上Document3です。これらの文書はすべてDocument型です。

各ドキュメントは、Document1Document2またはDocument3のいずれかであり、ちょうど1つのWorkに属します。問題は、クラスを使用しているときに、それがどのドキュメントタイプであるかを知らないことです。

ほとんどのデータベースフレンドリーで柔軟なソリューションは、各文書に文書の種類それは財産、占いを与え、一つのテーブルにすべてのドキュメントを置くことです:

public enum DocumentType 
{ 
    Document1, 
    Document2, 
    Document3, 
}; 

public class Work 
{ 
    public int WorkId { get; set; } 
    public virtual ICollection<Document> Document { get; set; } 
} 

public class Document 
{ 
    public int DocumentId {get; set;} // primary key 
    public DocumentType DocumentType {get; set;} 

    public int WorkId { get; set; } 
    public Work Work { get; set; } 
} 
public MyDbContext : DbContext 
{ 
    public DbSet<Work> Works {get; set;} 
    public DbSet<Document> Documents {get; set;} 
} 

結果は文書で1つの表です。 WorkIdの列には、ドキュメントが属するワークが表示されます。 Column DocumentTypeは、それがDocument1、Document2、Document3のいずれであるかを示します。

この方法では、データベースを変更することなく、新しいDocumentTypesを簡単に追加できます。特定のタイプのすべてのドキュメントを高速検索する場合は、キー(Id、DocumentType)を使用して余分なインデックスを作成することを検討してください。

実際には3つの異なるテーブルが必要な場合もう文書2に、あなたは

public class Document1 : Document 
{ 
    public int WorkId {get; set;} 
    public virtual Work Work {get; set;} 
} 
public MyDbContext : DbContext 
{ 
    public DbSet<Work> Works {get; set;} 
    public DbSet<Document1> Document1s {get; set;} 
    public DbSet<Document2> Document2s {get; set;} 
    public DbSet<Document3> Document3s {get; set;} 
} 

このためTable-per-concrete-classの使用を検討して、これらのクラスのための文書から派生したクラス3、および3 DbSetを作成する必要があります。この方法で、Document1、Document2用のテーブル、Document3用のテーブルを取得します。

1

Documentクラスには3つのコレクションがあります。そのため、Documentクラスには3つのキーが必要です。 DocumentのインスタンスがWorkIdの場合、そのIDを持つWorkのインスタンスにはどこに存在しますか?それはDocument1,Document2、またはDocument3に属していますか? 1つのキーだけでは、これを判断する方法はありません。 Entity Frameworkはこれを認識しており、問題を解決するための3つのキーを作成しています。

関連する問題