更新子记录 EF Core 3.0 中的错误实体之间的关联已被切断,但关系被标记为“必需”

Posted

技术标签:

【中文标题】更新子记录 EF Core 3.0 中的错误实体之间的关联已被切断,但关系被标记为“必需”【英文标题】:Error in Update child record EF Core 3.0 The association between entities has been severed but the relationship is either marked as 'Required' 【发布时间】:2020-07-28 11:29:21 【问题描述】:

我正在使用 EF Core 版本:3.0 数据库提供程序:Microsoft.EntityFrameworkCore.SqlServer

我有两个表:PROFILO(主)和PROFILOTITOLODISTUDIO(详细) 这是模型:

简介模型

 public partial class Profilo

    public Profilo()
    
        ProfiloTitoloDiStudio = new List<ProfiloTitoloDiStudio>();
    

    [Key]
    public Guid IdProfilo  get; set; 
    [Required]
    [StringLength(256)]
    public string Nome  get; set; 
    [StringLength(256)]
    public string Cognome  get; set; 

    [InverseProperty("IdProfiloNavigation")]
    public virtual IList<ProfiloTitoloDiStudio> ProfiloTitoloDiStudio  get; set; 

PROFILOTITOLODISTUDIO 模型

public partial class ProfiloTitoloDiStudio

    [Key]
    public int IdProfiloTitoloDiStudio  get; set; 
    public Guid IdProfilo  get; set; 
    [Required]
    [StringLength(256)]
    public string DenominazioneCorsoStudio  get; set; 
    [ForeignKey(nameof(IdProfilo))]
    [InverseProperty(nameof(Profilo.ProfiloTitoloDiStudio))]
    public virtual Profilo IdProfiloNavigation  get; set; 

PROFILOTITOLODISTUDIO 表中的 IdProfilo 外键必须为 NOT NULL

在控制器的编辑操作中,我收到带有视图边界字段的对象作为输入,即使我不更改任何值,savechanges () 总是返回错误:

InvalidOperationException:实体 'Profilo' 和 'ProfiloTitoloDiStudio' 与键值 'IdProfilo: 45c42779-39b6-4047-91d1-12253a79b7f6' 之间的关联已被切断,但该关系被标记为“必需”或隐式需要,因为外键不可为空。如果在切断所需关系时应删除依赖/子实体,则将关系设置为使用级联删除。

这是保存代码:

public async Task<IActionResult> Edit(Profilo profiloinput)
    


            var _profiloDB = await _dbcontext.Profilo
                                               .Include(p => p.ProfiloTitoloDiStudio)
                                               .SingleOrDefaultAsync(p => p.IdProfilo == profiloinput.IdProfilo);

            _profiloDB.Nome = profiloinput.Nome;
            _profiloDB.Cognome = profiloinput.Cognome;


            _profiloDB.ProfiloTitoloDiStudio = profiloinput.ProfiloTitoloDiStudio;


            var x = await _dbcontext.SaveChangesAsync();


    

我没有破坏 PROFILEPROFILOTITOLODISTUDIO 之间的任何关系,我只是尝试 对子表进行更新,配置文件对象中的IDPROFILO外键。ProfiloTitoloDiStudio完美增强!!!

【问题讨论】:

【参考方案1】:

我解决了,在一些帖子中报告了这个解决方案但不是很清楚,问题出在两个表之间的关系设置,在DbContext的类中设置:

public partial class MyDbContext : DbContext

这是受影响的代码部分:之前

        modelBuilder.Entity<ProfiloTitoloDiStudio>(entity =>
        
            entity.HasKey(e => e.IdProfiloTitoloDiStudio)
                .HasName("PK_TitoloDiStudio");

            entity.HasOne(d => d.IdProfiloNavigation)
                .WithMany(p => p.ProfiloTitoloDiStudio)
                .HasForeignKey(d => d.IdProfilo)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_ProfiloTitoloDiStudio_Profilo");

        );

这是更改后的:

        modelBuilder.Entity<ProfiloTitoloDiStudio>(entity =>
        
            entity.HasKey(e => e.IdProfiloTitoloDiStudio)
                .HasName("PK_TitoloDiStudio");

            entity.HasOne(d => d.IdProfiloNavigation)
                .WithMany(p => p.ProfiloTitoloDiStudio)
                .HasForeignKey(d => d.IdProfilo)
                /*.OnDelete(DeleteBehavior.ClientSetNull)*/
                .HasConstraintName("FK_ProfiloTitoloDiStudio_Profilo");

        );

实际上,关系 .OnDelete 的设置从 DeleteBehavior.ClientSetNull 更改为 DeleteBehavior.Cascade这将是默认设置,因此我将其删除。

我的难点是MyDbContext类是由Scaffold-DbContext(DatabaseFirst)生成的,所以我不想修改它,所以我直接在DataBase上修改了关系,让Scaffold-DbContext转了!!!

发送给 BombaAnarchica

【讨论】:

以上是关于更新子记录 EF Core 3.0 中的错误实体之间的关联已被切断,但关系被标记为“必需”的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

如何在 EF Core 3.1 中使用脚手架流程更新我的实体 - 执行超时已过期

EF Core - 添加相关实体时出错

EF Core中怎么实现自动更新实体的属性值到数据库

如何通过 FromSqlRaw 在 EF Core 3.0 中调用存储过程

在 EF 中更新父实体时如何添加/更新子实体