我有一个应用程序可以在脱机模式下创建实体,然后在数据库可用时将其保存到数据库中。许多实体可以在应用程序脱机时创建。
以下是该方法的基本版本:
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”是否已完全填充。似乎存在性检查正在使对象图中的“实体”无效,但我对实体框架的内部工作还不够熟悉,无法确定。
是什么导致了这个异常,我怎样才能避免它呢?