我有一个应用程序,它以脱机模式创建实体,然后在可用时将它们保存到数据库中。在应用程序离线时可能会创建许多实体。
以下是该方法的基本版本:
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'是否已完全填充。似乎存在检查使对象图中的“实体”无效,但我对实体框架的内部工作方式不够熟悉。
导致该异常的原因是什么,我该如何避免?
答案 0 :(得分:0)
为什么不在SomeTextHash列上创建一个唯一索引,如果抛出“无法插入重复等级”类型的异常,请吞下它?
答案 1 :(得分:0)
最终看起来像检查是重置我的上下文。我需要单独跟踪我的更改,然后在完成hashvalue检查后添加实体。