2016-09-27 123 views
2

我有DocumentDocumentID(PK)& DocumentName列。 另一個表Connector_DocumentConnectorID(PK),DocumentID(FK)&其他一些列。將列表插入多個具有外鍵關係的表中實體框架

我有一個List<Document> & ConnectorId作爲輸入。我要救List<Document>Document表,在表Connector_Document得到所有這些& DocumentID保存與所提供的connectorID &獲取DocumentId

有了以下輸入

List<Document> documents = new List<Document>{new Document{ DocumentName ="test1"}, 
new Document{DocumentName ="test2"}}; 
int connectorId = 5 

我的輸出應該是:

文件表

DocumentID  DocumentName 
----------------------------- 
    10    test1 
    11    test2 

Connector_Document表:

ConnectorID DocumentID 
     5    10 
     5    11 

我知道I C通過List循環,在文檔表中添加獲取它的PK &使用相同的插入Connector_Document表。但是,我不認爲這是我期望的某種方式應該由EF爲此提供的有效方式。有人幫助我。

using (Entities context = new Entities()) 
{ 
    using (var dbContextTransaction = context.Database.BeginTransaction()) 
    { 
     context.Documents.Add(document); 
     context.SaveChanges(); 

     if (connectorDocument != null) 
     { 
      connectorDocument.DocumentID = document.DocumentID; 
      context.Connector_Document.Add(connectorDocument); 
      context.SaveChanges(); 
     } 

     dbContextTransaction.Commit(); 
    } 
} 

我使用實體框架6.

回答

0

你並不需要在這裏交易:

如果這是一個單一的對象,而不是名單,我可以這樣做。因此,您已經正確定義了關係,下面的代碼應該沒有任何問題。您不需要爲相關對象手動操作數據插入。這些由EF完成。

using (Entities context = new Entities()) 
     { 

      foreach (var d in documents) 
      { 
       context.Documents.Add(d); 
       context.SaveChanges(); 
      } 
     } 
1

您可以使用AddRange以您想要的方式保存文檔列表。但是因爲每個Connector_Document行都需要單獨的對象,所以您仍然需要一種方法來創建它們。我會建議這樣的事情:

using (Entities context = new Entities()) 
{ 
    using (var dbContextTransaction = context.Database.BeginTransaction()) 
    { 
     context.Documents.AddRange(documents); 
     context.SaveChanges(); 

     var connectorDocuments = from doc in documents 
           select new Connector_Document 
           { 
            ConnectorId = connectorId, 
            DocumentId = doc.DocumentId 
           }; 
     context.Connector_Document.AddRange(connectorDocuments); 
     context.SaveChanges(); 
     dbContextTransaction.Commit(); 
    } 
} 
相關問題