【问题标题】:How ASP.NET Core MVC + Entity Framework Core get the id of a newly added objectASP.NET Core MVC + Entity Framework Core 如何获取新增对象的id
【发布时间】:2020-06-27 20:34:33
【问题描述】:

我有以下操作方法来添加父 (Submission) 和子 (SubmissionQuestionSubmission) 对象:

public async Task<IActionResult> Create([Bind("Submission,SubmissionQuestionSubmission")] SubmissionCreate sc )
{
    if (ModelState.IsValid)
    {
        var newsubmission  =  _context.Submission.Add(sc.Submission);
        sc.Submission.Created = DateTime.Now;
        await _context.SaveChangesAsync();

        foreach (var v in sc.SubmissionQuestionSubmission)
        {
            v.SubmissionId = sc.Submission.Id;//i though this will be null..
            _context.SubmissionQuestionSubmission.Add(v);
        }

        await _context.SaveChangesAsync();
    }
}

一开始我以为代码行不通,因为sc.Submission.Id 父外键将为空,因为我刚刚添加了提交对象。但是我的代码运行良好,那么 ASP.NET Core MVC 和 Entity Framework Core 是如何检索到新添加对象的Id 的呢?它会自动往返于数据库吗?

这是我的模型类:

public partial class Submission
{
    public Submission()
    {
        SubmissionQuestionSubmission = new HashSet<SubmissionQuestionSubmission>();
    }

    public long Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? Created { get; set; }

    public virtual ICollection<SubmissionQuestionSubmission> SubmissionQuestionSubmission { get; set; }
}

public partial class SubmissionQuestionSubmission
{
        public int SubmissionQuestionId { get; set; }
        public long SubmissionId { get; set; }
        public bool? Answer { get; set; }

        public virtual Submission Submission { get; set; }
        public virtual SubmissionQuestion SubmissionQuestion { get; set; }
}

【问题讨论】:

  • 不需要这样做。您可以(并且应该)将SubmissionQuestionSubmission 添加到Submission.SubmissionQuestionSubmission 并调用SaveChanges 一次。
  • @GertArnold 您能否就您的回复提供更多建议?

标签: c# asp.net-core entity-framework-core asp.net-core-mvc


【解决方案1】:

当调用SaveChanges() 时,它将自动更新新保存实体的Id 字段。例如,EF 在保存新实体时可能会生成如下查询:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN

INSERT INTO `Author` (`Name`)
VALUES ('test');

SELECT `Id`
FROM `Author`
WHERE ROW_COUNT() = 1
 AND `Id`=LAST_INSERT_ID()

COMMIT

如您所见,它将运行INSERT INTO 查询,然后运行SELECT 查询以获取新插入行的Id,该行将保存在Id 属性中。

【讨论】:

  • 感谢您的有用回复,但我有一个问题 thisLAST_INSERT_ID() 是否会导致 EF 在有大量用户执行相同代码的系统中检索错误的 ID?跨度>
  • @testtest 否,LAST_INSERT_ID() 按连接工作,EF 将使用事务插入新实体并读取新创建的 ID。
猜你喜欢
  • 2018-03-19
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2022-11-29
  • 2021-05-08
  • 1970-01-01
相关资源
最近更新 更多