2013-06-11 144 views
1

我正在使用Visual Studio 2010,C#4.0和Entity Framework 5.0。我一直在使用數據庫的第一次開發已經很多年了,但是我正在嘗試首先轉向代碼並遇到問題。閱讀和搜索似乎沒有解決問題EF代碼首先使用多對多關係

我簡化了我的問題,如下所示 - 我有兩個類 - 評估者和文檔。

public class Assessor 
{ 
    public int AssessorID { get; set; } 
    public virtual List<Document> Documents { get; set; }  
} 

public class Document 
{ 
    public int DocumentID { get; set; } 
    public string DocumentLocation { get; set; } 
    public string DocumentName { get; set; } 
    public virtual List<Assessor> Assessors { get; set; } 
} 

與上下文

public class DocumentAssignment : DbContext 
{ 
    public DbSet<Assessor> Assessors { get; set; } 
    public DbSet<Document> Documents { get; set; } 
} 

評估者可以有許多文件和文檔可以有許多評估(經典許多一對多的關係)。 我使用約定來創建關係,但也使用流利的API。我已經播種了文件表。

我的兩個問題: ONE - 我想將文檔分配給評估者 - 將其保存到數據庫的最佳方法是什麼?

我有以下方法來檢索指派給一個評估文件:

public static IEnumerable<MaternalDocument> GetAssignedDocumentList(int UserID, string ConnectionString) 
    { 
     using (DocumentAssignment dbContext = new DocumentAssignment(ConnectionString)) 
     { 
      return returnValue = dbContext.MaternalAssessments 
       .Where(m => m.AssessorID == UserID) 
       .Include(m => m.MaternalDocuments) 
       .Select(m => m.MaternalDocuments) 
       .ToList(); 
     } 
    } 

,但我不能得到這個,因爲映射問題編譯。我究竟做錯了什麼?

回答

4

您必須通過覆蓋DocumentAssignment中的OnModelCreating來告訴DbContext關於如何設置多對多關係。將此代碼中的AssessorDocuments替換爲關係表名稱。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Assessor>() 
      .HasMany(a => a.Documents) 
      .WithMany(d => d.Assessors) 
      .Map(m => 
       { 
        m.MapLeftKey("AssessorID"); 
        m.MapRightKey("DocumentID"); 
        m.ToTable("AssessorDocuments"); 
       }); 
     base.OnModelCreating(modelBuilder); 
    } 

要將文檔分配到評估機構(假設的文稿1 DocumentID存在,評稅爲1的AssessorID存在):

 using (var context = new DocumentAssignment()) 
     { 
      var assessor = context.Assessors.Find(1); 
      var document = context.Documents.Find(1); 
      assessor.Documents.Add(document); 
      context.SaveChanges(); 
     } 

你GetAssignedDocumentList方法會是這個樣子:

public static IEnumerable<Document> GetAssignedDocumentList(int UserID) 
    { 
     using (var context = new DocumentAssignment()) 
     { 
      return context.Documents.Where(d => d.Assessors.Any(a => a.AssessorID == UserID)); 
     } 
    } 
+0

這太棒了 - 謝謝 - 我知道它一定很簡單。 –

+1

+1。很好的解釋。 – Rohit