实体框架创建更新查询不必要
我试图用LINQ to SQL更新记录,但在某些情况下,值与原始值相同,然后Enitty框架创建更新查询不必要。
var objForupdate = context.temp.FirstOrDefault();
if(objForupdate != null)
{
objForupdate.Name = "VJ"; // Original Value also "VJ"
}
// Create update query for above.
context.SaveChanges();
更新了嘿史蒂文伍德
在这里我有我的数据库有20个字段的场景。 有时某些数据与原始数据相同,那么Entity框架也会为此创建更新查询。
如果数据行不处于脏状态,那么很简单,因此不需要更新它。 但实体框架的工作也创建更新查询。 只需使用配置文件工具来检查执行SaveChanges()方法后在数据库服务器上执行的查询类型。
解决方案
使用以下函数来检查实体对象是否已更改。 如果不是的话,它会将它从EntityState.Modified更改为EntityState.Unchanged。
public static bool ChangeStateIfNotModified(this EntityObject entity, ObjectContext context)
{
if (entity.EntityState == EntityState.Modified)
{
ObjectStateEntry state = ontext.ObjectStateManager.GetObjectStateEntry(entity);
DbDataRecord orig = state.OriginalValues;
CurrentValueRecord curr = state.CurrentValues;
bool changed = false;
for (int i = 0; i < orig.FieldCount; ++i)
{
object origValue = orig.GetValue(i);
object curValue = curr.GetValue(i);
if (!origValue.Equals(curValue) && (!(origValue is byte[]) || !((byte[])origValue).SequenceEqual((byte[])curValue)))
{
changed = true;
break;
}
}
if (!changed)
{
state.ChangeState(EntityState.Unchanged);
}
return !changed;
}
return false;
}
如果您希望在两个值相同的情况下不执行更新,为何不执行如下操作:
if(objForUpdate.Name != orignalValue){
context.SaveChanges();
}
确保在适当的情况下处理您的环境。 例如,如果这是在MVC控制器中,我会将您的上下文置于控制器的Dispose()
方法中。
您应该使用String.Empty
而不是“'并在调试时验证该值是否相同。
编辑:你确定它是完全一样的价值?
如果我查看一个属性的生成代码,它看起来像这样:
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.String id
{
get
{
return _id;
}
set
{
if (_id != value)
{
OnidChanging(value);
ReportPropertyChanging("id");
_id = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("id");
OnidChanged();
}
}
}
private global::System.String _id;
所以价值正在被比较。 验证生成的代码并设置一个断点来调试它。 如果状态改变,则会发生查询。 如果它没有进入if条件并且更新查询仍然存在,那么问题就在别处。
链接地址: http://www.djcxy.com/p/33579.html