【发布时间】:2019-12-03 18:54:04
【问题描述】:
我需要使用.net core 应用程序将多个值插入到多个表中。
第一个表 [AI_Table] 包含键,第二个 表 [AI_TableLanguage] 包含多种语言的名称。 [AI_Table] 具有 IDENTITY 主键,因此 DB 生成它。我需要从 [AI_Table] 中获取该密钥并将其插入 [AI_TableLanguage]。
首先,我不确定 get max key 是正确的方法,其次,如果两个或多个用户同时访问此表怎么办?会不会死机,还是什么?所以我的问题是,如果不是,这个http post action结果如何作为一个单一的事务,所以没有人可以中断这些插入?
总体思路:
- 插入 [AI_Table](DB 生成 PK)。
- 获取该 PK 并将其插入 [AI_TableLanguage] 三次。
我阅读了一些其他得到解答的问题,还阅读了 Microsoft 文档。我找不到任何使用 RAW SQL 的答案。另外,我找不到整个 IActionResult 是否充当单个事务。
[HttpPost, ActionName("Create")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(IzvorDropDown IzvorDropDown, InstitucijaDropDown InstitucijaDropDown, UpitTabeleCreate UpitTabeleCreate)
{
//insert
await context.Database.ExecuteSqlCommandAsync($"INSERT INTO AI_Table (IAICode, VOD, VDO, user_insert, user_update, date_insert, date_update) VALUES ({IzvorDropDown.IAIcode},{UpitTabeleCreate.VOD},{UpitTabeleCreate.VDO},{TrenutniKorisnik},{TrenutniKorisnik},{TrenutnoVreme},{TrenutnoVreme})");
//get max key
var item = await context.NextIAITableCodeGenerator.FromSql($"SELECT ISNULL(MAX(IAITableCode), 0) AS NextIAIcode FROM AI_Table").ToListAsync();
int IAITableCode = item[0].NextIAIcode;
//insert continue
await context.Database.ExecuteSqlCommandAsync($"INSERT INTO AI_TableLanguage (IAITableCode, LanguageID, TableName) VALUES ({IAITableCode},1,{UpitTabeleCreate.TableNameCyr})"); //cirilica - radi
await context.Database.ExecuteSqlCommandAsync($"INSERT INTO AI_TableLanguage (IAITableCode, LanguageID, TableName) VALUES ({IAITableCode},2,{UpitTabeleCreate.TableNameLat})"); //latinica
await context.Database.ExecuteSqlCommandAsync($"INSERT INTO AI_TableLanguage (IAITableCode, LanguageID, TableName) VALUES ({IAITableCode},3,{UpitTabeleCreate.TableNameEng})"); //engleski
return RedirectToAction(nameof(Index));
}
代码本身有效。它会正确插入数据库,但我不知道当有许多用户试图同时访问这些表时它是否会继续这样做。
【问题讨论】:
-
这整件事不需要原始 sql,您可以使用 ef 事务来完成它,并且更清洁地获得相同的结果。或者您可以将其写入单个查询而不是多个命令和用户 Context.Database.BeginTransaction() (我不记得确切的路径)
标签: sql asp.net-core-mvc entity-framework-core