【问题标题】:Error in Update child record EF Core 3.0 The association between entities has been severed but the relationship is either marked as 'Required'更新子记录 EF Core 3.0 中的错误实体之间的关联已被切断,但关系被标记为“必需”
【发布时间】: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完美增强!!!

【问题讨论】:

    标签: entity-framework .net-core savechanges ef-core-3.0


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2021-03-18
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多