Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么EF在这里抛出异常?_C#_.net_Entity Framework_Entity Framework 6 - Fatal编程技术网

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

C# 为什么EF在这里抛出异常?,c#,.net,entity-framework,entity-framework-6,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 dbEnt

好吧,我在这里发疯了,我一直在尝试在我的存储库中为自己编写一个更新方法,出于某种奇怪的原因,当我调用这个时,我得到了一个异常

public virtual T Update(T entity)
{
    T dbEntity = _context.Set<T>().Find(entity.GetId());

    if (dbEntity != null)
    {
        _context.SaveChanges();
    }

    return dbEntity;
}

。。。导致相同的错误。

查看异常,我假设您忘记设置作为外键约束一部分的属性值;可能是
组织ID

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

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


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

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

通过在SaveChanges调用上放置断点并检查“\u context.ChangeTracker.Entries()”以查找更改,然后查看调用堆栈以查看发生了什么,可以诊断此问题

根据您自己代码的复杂性,如果遇到这种情况,您可能会发现将更改跟踪器添加到监视窗口中,然后逐步查看代码,直到出现更改


谢谢@johnyhk的建议

抛出的异常是什么?您尚未过帐异常对象包含ValidationErrors属性。这是一个开始了解异常发生原因的好地方我很抱歉丢失了异常信息。。。现在就在那里。我想你在别的地方有问题。调用
SaveChanges()
时,将保存整个跟踪的实体。可能其中一个不符合EF验证角色。在
\u context.ChangeTracker.Entries()
中的内容的
SaveChanges
调用之前添加一些调试日志,以确定您以某种方式更改了什么。没有值类型属性为null。。。但这是没有意义的,因为我实际上没有更新任何东西。。。如果您阅读了代码,我从数据库中获取了一个实体,然后在上下文中调用SaveChanges,则不会执行任何其他操作。@Wardy,某些内容一定已更改。尝试使用Sql Server Profiler查看后台。将Profiler连接到Sql,这就是运行的全部内容。。。exec sp_executesql N'选择[Extent1].[Id]作为[Id],[Extent1].[OrganizationID]作为[OrganizationID],[Extent1].[Name]作为[Name],[Extent1].[Description]作为[Description],[Extent1].[Start]作为[Start],[Extent1].[End]作为[End],[Extent1].[Active]作为[Active],[Extent1].[AutoCalculationTime]作为[Active][AutoCalculationTime],[Extent1]。[AutoCutoOffTime]作为[ACOFI]。[AC_Program]作为[Extent1]的[AutoCutoOffTime],其中[Extent1]。[Id]=@EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1I预计会是这种情况,因为我只进行了1次其他调用(在相同方法中通过Id调用find).@Wardy,上面的查询不会改变数据。探查器中的某个地方应该有一个update语句。
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; }
}
    public virtual T Update(T entity)
    {
       _context.SaveChanges();
        return null;
    }