为什么EF在这里抛出异常?
本文关键字:抛出异常 在这里 EF 为什么 | 更新日期: 2023-09-27 18:10:01
好吧,我要疯了,我一直试图在我的存储库中编写一个更新方法,由于一些奇怪的原因,当我调用这个时,我得到了一个异常…
public virtual T Update(T entity)
{
T dbEntity = _context.Set<T>().Find(entity.GetId());
if (dbEntity != null)
{
_context.SaveChanges();
}
return dbEntity;
}
异常发生在"_context.SaveChanges();"上,在这种情况下上下文是DbContext实例而不是对象上下文。我首先使用EF代码,T的值如下…
public partial class AC_Programme
{
[Key]
public int Id { get; set; }
public int OrganisationId { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
public string Description { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public bool Active { get; set; }
[DataType(DataType.Time)]
public DateTime AutoCalculationTime { get; set; }
[DataType(DataType.Time)]
public DateTime AutoCutoffTime { get; set; }
public virtual ICollection<AC_Fund> AC_Funds { get; set; }
public virtual CX_Organisation Organisation { get; set; }
}
我不明白为什么尽管我什么都没做,我所做的只是通过id检索对象并调用保存更改,但它感觉需要搞乱关系。
任何想法?
编辑:哎呀,我忘了包含异常…
类型为'System '的异常。InvalidOperationException'在EntityFramework.dll中发生,但未在用户代码中处理
附加信息:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性被设置为空值。如果外键不支持空值,则必须定义一个新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
更奇怪的是…
public virtual T Update(T entity)
{
_context.SaveChanges();
return null;
}
…
问题是堆栈上的一些代码向EF添加了不应该在那里的更改,从而导致了这个问题。
通过在SaveChanges调用上放置一个断点并检查"_context.ChangeTracker.Entries()"是否有更改,然后查看调用堆栈以查看发生了什么,可以诊断此问题。
如果遇到这种情况,根据你自己代码的复杂程度,你可能会发现在监视窗口中添加变更跟踪器是有益的,然后逐步执行代码,直到出现更改。
谢谢你的建议@JohnnyHK看看例外,我假设你忘记设置一个属性的值,这是一个外键约束的一部分;可能是OrganizationId
?
另一种可能性是您从AC_Funds
属性中删除了子实体,但没有将该子实体标记为已删除。这将导致孤儿,这意味着将外键属性设置为空值。
由于外键不允许为空,所以子实体不能孤立,必须删除。
我建议打开Sql Server Profiler并窥视由实体框架生成的更新语句。