为什么EF在这里抛出异常?

时间:2015-08-27 12:45:08

标签: c# .net entity-framework entity-framework-6

好的,我在这里疯了,我一直在尝试在我的存储库中写自己的更新方法,并且由于一些奇怪的原因,当我调用它时,我得到一个例外......

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检索一个对象并调用保存更改,感觉需要弄乱关系。

任何想法?

编辑:oops我忘了包含例外......

  

EntityFramework.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理

     

附加信息:操作失败:无法更改关系,因为一个或多个外键属性不可为空。       当对关系进行更改时,相关的外键属性将设置为空值。       如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

它变得更加奇特......

    public virtual T Update(T entity)
    {
       _context.SaveChanges();
        return null;
    }

...导致同样的错误。

2 个答案:

答案 0 :(得分:0)

查看异常我假设您忘记设置属性的值,该属性是外键约束的一部分;也许OrganizationId

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

由于您的外键不允许空值,因此子实体不能孤立,必须删除。

我建议打开Sql Server Profiler并查看Entity Framework生成的更新语句。

答案 1 :(得分:0)

问题在于堆栈中的某些代码正在向EF中添加不应该导致此问题的更改。

通过在SaveChanges调用上设置断点并检查“_context.ChangeTracker.Entries()”是否有更改,然后通过调用堆栈查看正在进行的操作,可以诊断此问题。

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

感谢@JohnnyHK的建议