2017-06-07 225 views
0

我有一個實體框架6代碼的問題,首先從我的類創建多個外鍵時它應該只創建一個。你看我有2班 -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; } 
} 

現在,當我運行的代碼第一更新數據庫命令,在我的文檔表格它的工作表WorkId創建3個不同的外鍵,Work_Id1Work_Id2,這應該只是一個外鍵而不是3.我知道應該有一個簡單的註釋來解決這個問題或我需要添加一個流利的映射?

+0

'Work'通過三個屬性(集合)Document1,Document2和Document3連接到'Document'。這就是爲什麼它要創建三個外鍵。如果您只想指定1個外鍵,其他兩個將如何連接到文檔實體。 –

回答

0

顯然Work可能有零個或多個Document1,0個或多個Document2和零個或多個Document3。所有這些文檔都是Document類型的。

每個文檔都屬於一個Work,其中它可以是Document1Document2Document3。問題是,當使用你的類時,它不知道它是哪種文檔類型。

最數據庫友好和靈活的解決方案是給每個文件的屬性,告訴它是哪種類型的文檔,並把所有文件到一個表:

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;} 
} 

結果是一個表的文檔。列WorkId會告訴你文檔屬於哪個工作。 Column DocumentType會告訴你它是一個Document1,一個Document2還是一個Document3。

通過這種方式,無需更改數據庫即可輕鬆添加新的DocumentType。如果您希望快速搜索某種類型的所有文檔,請考慮使用鍵創建額外的索引(Id,DocumentType)

如果您確實需要三張不同的表格,例如因爲可能將來Document1不相似到文檔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此創建文檔派生三類,三DbSet。通過這種方式,您將得到一個帶有Document1的表格,一個帶有Document2的表格和一個用於Document3的表格

1

Work您的Work類有Document三個集合,所以Document類需要三個鍵來表示它所連接的位置。如果我有一個Document的實例,它的WorkId是4,那麼在Work的實例上存在那個ID的實例?它屬於Document1Document2Document3?只有一個鍵,就沒有辦法確定這一點。實體框架知道這一點,並已創建三個關鍵來解決問題。