将列表插入到具有外键关系的多个表中实体框架

时间:2016-09-27 15:24:07

标签: c# entity-framework optimization entity-framework-6

我有DocumentDocumentID(PK)& DocumentName列。 另一个表Connector_Document ConnectorID(PK),DocumentID(FK)&其他一些专栏。

我有List<Document>&amp; ConnectorId作为输入。我想在List<Document>表格中保存Document,获取所有这些内容DocumentID&amp;使用提供的Connector_Document&amp;表格保存在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

我知道我可以遍历列表,添加文档表获取它的PK&amp;使用相同的方法插入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();
    }
}

我正在使用Entity Framework 6。

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

您不需要在此处进行交易。因此,您已正确定义了关系,下面的代码应该没有任何问题。您不需要手动操作相关对象的数据插入。这些都是由EF完成的。

using (Entities context = new Entities())
      {

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