更新子记录 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();
我没有破坏 PROFILE 和 PROFILOTITOLODISTUDIO 之间的任何关系,我只是尝试 对子表进行更新,配置文件对象中的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 中使用脚手架流程更新我的实体 - 执行超时已过期