Entity Framework 嵌套对象的数据插入具有通过一个请求自动递增主键

Entity Framework data insertion with nested object having auto increment primary keys with one request

我只是想知道是否有人知道一种插入具有自动递增键的嵌套对象而不必一次插入一个对象的方法。

例如,假设我在数据库中有以下表格。

CREATE TABLE Analysis
(
    Analysis     bigint IDENTITY(1,1),
    AnalysisGuid uniqueidentifier NULL,
    Date         date(50)         NOT NULL,

    CONSTRAINT PK_Analysis PRIMARY KEY(AnalysisId)
);

CREATE TABLE Scenarios 
(
    ScenarioId   bigint IDENTITY(1,1),
    AnalysisId   bigint           NOT NULL,
    ScenarioGuid uniqueidentifier NULL,
    HVACNumber   int              NULL,

    CONSTRAINT FK_Scenarios_Analysis    
        FOREIGN KEY(Analysis) REFERENCES Analysis(AnalysisId)       
                ON DELETE CASCADE,
    CONSTRAINT PK_Scenarios PRIMARY KEY(ScenarioId)
);

其中 Scenario to Analysis 是 M:1 关系。在具有 M:1 关系的场景下还有一些其他具有自动递增主键的嵌套对象。

通过 API 的对象表示顶层的嵌套分析对象。由于此应用程序关注速度,是否有一种方法可以使用 Entity Framework 核心插入数据而无需通过

插入Analysis对象-->SaveChanges()-->获取分析主键-->遍历Scenarios列表-->一个一个插入--> SaveChanges() --> 获取 Scenario 主键 --> ...

如有任何帮助,我们将不胜感激。谢谢!

如果您的 EF properly/fully 已设置(parent/child 之间的导航属性、声明为数据库生成的键等),您只需将子对象添加到父级的导航 属性,将父项添加到上下文集并保存..

var p = new Parent();
var c1 = new Child();
var c2 = new Child();
p.Children.Add(c1);
p.Children.Add(c2); 

context.Parents.Add(p);
context.SaveChanges();

保存完成后,p.Id/c1.ParentId/c2.ParentId就是数据库计算出来的父ID,c1.Id/c2.Id也是它们计算出来的值。

反之亦然(将父项添加到子项);更改跟踪器并不挑剔,只要它能以某种方式到达您的更改