EF Core 3.0 将连接实体添加到集合在一对多关系中失败

Ist*_*ska 3 c# repository asp.net-core ef-core-3.0

我尝试通过集合的导航属性添加实体,但出现以下消息:

“数据库操作预计会影响 1 行,但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。请参阅http://go.microsoft.com/fwlink/?LinkId=527962了解有关理解和处理乐观并发异常的信息。”

这些模型是:

建议组数据库:

public class SuggestionGroupDb
{
    public Guid Id { get; set; }

    [Required]
    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual TeguUserDb User { get; set; }

    [Required(AllowEmptyStrings=false, ErrorMessage = "Required")]
    [StringLength(30, MinimumLength = 1, ErrorMessage = "Invalid")]
    public string Name { get; set; }

    public int OrderNo { get; set; }

    public virtual ICollection<SuggestionItemDb> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

建议项目数据库:

public class SuggestionItemDb
{
    public Guid Id { get; set; }

    [Required]
    public Guid SuggestionGroupId { get; set; }
    [ForeignKey("SuggestionGroupId")]
    public virtual SuggestionGroupDb SuggestionGroup { get; set; }

    [Required(AllowEmptyStrings=false, ErrorMessage = "Required")]
    [StringLength(30, MinimumLength = 1, ErrorMessage = "Invalid")]
    public string Name { get; set; }

    public int OrderNo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

SuggestionGroup Repository Update 函数(简化):

    public async Task<SuggestionGroupRepositoryResult> UpdateAsync(string userid, SuggestionGroupDb suggestiongroup)
    {
        // Step 01 - Get the Entity
        var dbSuggestionGroup = await GetAsync(userid, suggestiongroup.Id, suggestiongroup.Name);

        // Step 02 - Update the items (just add one now)
        foreach (var item in suggestiongroup.Items)
        {
            var sidb = new SuggestionItemDb() {Id = item.Id, Name = item.Name, OrderNo = item.OrderNo, SuggestionGroupId = item.SuggestionGroupId};
            dbSuggestionGroup .Items.Add(sidb);
        }

        // Step 03 - Update the changes
        try
        {
            var updated = context.AccSuggestionGroups.Update(dbSuggestionGroup);
            await context.SaveChangesAsync();

            return new SuggestionGroupRepositoryResult("Valid") /*{SuggestionGroup = updated.Entity}*/;
        }
        catch (Exception e)
        {
            context.Reset();
            return new SuggestionGroupRepositoryResult("Failed", e.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是 SaveChanges 抛出了给定消息的异常。是否可以通过 SuggestionGroup 更新 SuggestionItems?

我正在使用 EF Core 3.0 预览版 6。

Dan*_*Dan 13

在 EF Core 3.0 之前,DetectChanges策略发现的未跟踪实体(在您的情况下,通过将未跟踪实体添加到集合中)将自动处于Added状态。

这已不再是这种情况。从 Entity Framework Core 3.0 开始,实体将自动添加到Modified状态中。

为什么

进行此更改是为了在使用存储生成的键时更轻松、更一致地处理断开连接的实体图。

来源:EF Core 3.0 - 重大变化

您可以Added通过将键属性配置为显式不使用生成的值来强制在状态中添加新的未跟踪实体。

例如:

public class SuggestionItemDb
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

或者使用 fluent API

modelBuilder
    .Entity<SuggestionItemDb>()
    .Property(e => e.Id)
    .ValueGeneratedNever();
Run Code Online (Sandbox Code Playgroud)