带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键
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
也将是它们的计算值。
反之亦然(将父级添加到子级);更改跟踪器并不繁琐,只要它能够以某种方式到达您的更改即可
【讨论】:
谢谢你,成功了。我不知道实体框架可以做到这一点。以上是关于带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键的主要内容,如果未能解决你的问题,请参考以下文章