代码之家  ›  专栏  ›  技术社区  ›  William Edmondson

当调用“savechanges”接收异常时,“无法将值NULL插入列“xxxxx””

  •  1
  • William Edmondson  · 技术社区  · 14 年前

    我有一个应用程序可以在脱机模式下创建实体,然后在数据库可用时将其保存到数据库中。许多实体可以在应用程序脱机时创建。

    以下是该方法的基本版本:

    public void SaveEntityToDatabase(Entity entity)            
    {
        Context.Entities.AddObject(entity);
        Context.SaveChanges();
    }
    

    由于这些实体是离线创建的,因此无法判断是否存在具有类似数据的现有实体。例如,我有一个字段“someText”,该字段在记录之间必须是唯一的。此字段是SQL Server中的“文本”类型,因此不要直接比较哈希值,而是比较哈希值。如果没有匹配的记录,我会继续添加新的实体,否则我会提前退出方法。

    以下是更新方法的基本版本:

    public void SaveEntityToDatabase(Entity entity)            
    {
        var hashedValue = entity.SomeText.ToSHA1();
    
        if (Context.Entities.Where(e => e.SomeTextHash == hashedValue).Count() > 0)
            return;
    
        entity.SomeTextHash = hashedValue;
    
        Context.Entities.AddObject(entity);
        Context.SaveChanges();
    }
    

    不幸的是,执行存在性检查会导致我的应用程序引发异常:

    Cannot insert the value NULL into column 'SomeText'.
    

    注释检查可以解决问题,但不允许我检查现有记录。

    //if (Context.Entities.Where(e => e.SomeTextHash == hashedValue).Count() > 0)
        //return;
    

    如果我在savechanges处插入断点,并检查“entity”是否已完全填充。似乎存在性检查正在使对象图中的“实体”无效,但我对实体框架的内部工作还不够熟悉,无法确定。

    是什么导致了这个异常,我怎样才能避免它呢?

    2 回复  |  直到 11 年前
        1
  •  0
  •   Jaimal Chohan    14 年前

    为什么不在sometexthash列上创建一个唯一的索引,如果抛出了“cannot insert duplicate blah blah”类型异常,就将其吞没?

        2
  •  0
  •   William Edmondson    13 年前

    最终,检查似乎是在重置我的上下文。我需要单独跟踪我的更改,然后在哈希值检查完成后添加实体。