带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键

Posted

技术标签:

【中文标题】带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键【英文标题】:Entity Framework data insertion with nested object having auto increment primary keys with one request 【发布时间】:2022-01-09 08:21:47 【问题描述】:

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

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

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)
);

场景到分析是 M:1 关系。在具有 M:1 关系的场景下,还有一些其他具有自动递增主键的嵌套对象。

来自 API 的对象代表顶层的嵌套分析对象。由于速度是此应用程序的一个问题,有没有办法使用 Entity Framework Core 插入数据而无需通过

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

任何帮助将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

如果您的 EF 设置正确/完全(父/子之间的导航属性,声明为 db 生成的键等),您只需将子对象添加到父对象的导航属性,将父对象添加到上下文集中并保存它..

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 将是 db 计算的父 ID,c1.Id/c2.Id 也将是它们的计算值。

反之亦然(将父级添加到子级);更改跟踪器并不繁琐,只要它能够以某种方式到达您的更改即可

【讨论】:

谢谢你,成功了。我不知道实体框架可以做到这一点。

以上是关于带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤嵌套集合实体框架对象?

具有过滤索引的实体框架 - “无法在对象中插入重复的键行”

实体框架无法在对象中插入重复键

实体框架代码首先用于具有属性集合的对象

使用实体框架将行插入到具有复合键的表中

使用实体框架6插入已断开的相关实体