EFCore:简单属性更新过程中实体关联错误



我想在控制器中设置一个bool属性并将其保存到数据库中。EF抛出一个关于其他属性的错误,这些属性甚至没有被修改。

实体"User"one_answers"RequestDetail"与键值"System.InvalidOperationException:键值为"{Id:40}"的实体"User"one_answers"RequestDetail"具有已断开,但该关系被标记为"必需"或隐式要求,因为外键不可为null。如果当需要关系时,应删除从属/子实体则将关系设置为使用级联删除。

如果我用一个额外的参数调用我的方法,它必须更改一个RequestDetail记录的RequestSent属性,这非常有效。但是在不使用此附加参数的情况下调用方法时,必须更改多个RequestDetail记录的此属性。这就是它抛出错误的地方。我不修改任何与用户相关的内容。如果它必须一次做更多的记录,就会抛出这个错误。即使我用FirstOrDefaults((和immediate SaveChanges((将foreach重写一段时间,它也会在第二轮中出错。

我的方法:

var head = await _ctx.RequestHeads.FirstOrDefaultAsync(x=>x.Id == d.Id);
if (!d.DetailId.HasValue) {
var details = _ctx.RequestDetails.Include(x=>x.BuyerUser)
.Where(x=>x.RequestHeadId == head.Id); 
//not working, always throws an error if it has to modify more than one record
await details.ForEachAsync(detail => {
detail.RequestSent = true;
});
} else {
var detail = head.Details.FirstOrDefault(x=>x.Id == d.DetailId.Value); //works ok, always
detail.RequestSent = true;
}
await _ctx.SaveChangesAsync();

我的型号:

public class RequestHead
{
[Key, MaxLength(15)]
public string Id { get; set; }
public DateTime CreateDate { get; set; }
public int CreateUserId { get; set; }
[ForeignKey("CreateUserId")]
public User CreateUser { get; set; }
public DateTime? AcceptDate { get; set; }
public int? AcceptUserId { get; set; }
[ForeignKey("AcceptUserId")]
public User AcceptUser { get; set; }
public DateTime? CloseDate { get; set; }
public int? CloseUserId { get; set; }
[ForeignKey("CloseUserId")]
public User CloseUser { get; set; }     
public int? CloseReason { get; set; }   
public bool IsArchive { get; set; }
[MaxLength(8)]
public string OrganizationCode { get; set; }
[ForeignKey("OrganizationCode")]
public Organization Organization { get; set; }
public virtual ICollection<RequestDetail> Details { get; set; }
public virtual ICollection<RequestAttachment> Attachments { get; set; }
}
public class RequestDetail
{
[Key]
public int Id { get; set; }
public string RequestHeadId { get; set; }
[ForeignKey("RequestHeadId")]
public RequestHead RequestHead { get; set; }
[MaxLength(20)]
public string ProductCode { get; set; }
[ForeignKey("ProductCode")]
public Product Product { get; set; }
public string ProductName { get; set; }
public bool NoProductCode { get; set; }
public string Description { get; set; }
public DateTime CreateDate { get; set; }
public int CreateUserId { get; set; }
[ForeignKey("CreateUserId")]
public User CreateUser { get; set; }

public DateTime? DelegateDate { get; set; }
public int? DelegateUserId { get; set; }
[ForeignKey("DelegateUserId")]
public User DelegateUser { get; set; }

public int? BuyerUserId { get; set; }
[ForeignKey("BuyerUserId")]
public User BuyerUser { get; set; }
public bool RequestSent { get; set; }
public virtual ICollection<RequestAttachment> Attachments { get; set; }
}

上下文:

modelBuilder.Entity<RequestHead>()
.HasOne(r=>r.CreateUser)
.WithOne().OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<RequestHead>()
.HasMany(r => r.Details)
.WithOne(x=>x.RequestHead)
.HasForeignKey(rd => rd.RequestHeadId);
modelBuilder.Entity<RequestDetail>()
.HasOne(r=>r.CreateUser)
.WithOne().OnDelete(DeleteBehavior.Restrict);

解决方案是更改RequestDetail<=>从WithOne((到WithMany((的用户关系。尽管错误消息有点误导性,但@IvanStoev可能的解释如下:

我猜,在一对一的情况下,代码需要一条记录,所以当第二张FK相同的唱片出现了,他们感到困惑并决定记录被删除

最新更新