2016-09-27 131 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(); 
    } 
} 
相关问题