0

我正在尝试使用 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 个字段。有时某些数据与原始数据相同,然后实体框架也会为此创建更新查询。

如果数据行不处于脏状态,则很简单,则无需更新它。但是实体框架也为此创建了更新查询。只需使用配置文件工具检查执行 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;
}
4

2 回答 2

1

如果您希望在两个值相同的情况下不执行更新,为什么不执行以下操作:

if(objForUpdate.Name != orignalValue){
      context.SaveChanges();
}

确保在适当的地方处理你的上下文。例如,如果这是在 MVC 控制器中,我会在控制器的Dispose()方法中处理您的上下文。

于 2013-10-08T13:56:31.603 回答
-1

您应该使用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 条件并且更新查询仍然发生,则问题出在其他地方。

于 2013-10-08T13:55:59.713 回答