为什么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在这里抛出异常?

问题是堆栈上的一些代码向EF添加了不应该在那里的更改,从而导致了这个问题。

通过在SaveChanges调用上放置一个断点并检查"_context.ChangeTracker.Entries()"是否有更改,然后查看调用堆栈以查看发生了什么,可以诊断此问题。

如果遇到这种情况,根据你自己代码的复杂程度,你可能会发现在监视窗口中添加变更跟踪器是有益的,然后逐步执行代码,直到出现更改。

谢谢你的建议@JohnnyHK

看看例外,我假设你忘记设置一个属性的值,这是一个外键约束的一部分;可能是OrganizationId ?

另一种可能性是您从AC_Funds属性中删除了子实体,但没有将该子实体标记为已删除。这将导致孤儿,这意味着将外键属性设置为空值。

由于外键不允许为空,所以子实体不能孤立,必须删除。

我建议打开Sql Server Profiler并窥视由实体框架生成的更新语句。