当调用'SaveChanges'时收到异常“无法将值NULL插入列'XXXXX'”

时间:2010-09-19 20:01:18

标签: c# .net entity-framework

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

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

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 个答案:

答案 0 :(得分:0)

为什么不在SomeTextHash列上创建一个唯一索引,如果抛出“无法插入重复等级”类型的异常,请吞下它?

答案 1 :(得分:0)

最终看起来像检查是重置我的上下文。我需要单独跟踪我的更改,然后在完成hashvalue检查后添加实体。