【问题标题】:Does EF update objects just because a property changes or only if it has a different value?EF 是否仅因为属性更改或仅在其具有不同值时才更新对象?
【发布时间】:2010-09-21 16:21:10
【问题描述】:

我有一个导入,从平面文件到针对 SQL Server 的 EDM,其中很少有记录实际更改(使用相同的导入文件运行它无数次),但是更新 500 条记录的 SaveChanges 调用需要很长时间。我猜这是因为我在实体对象上设置了每个属性,然后 EF 使用ReportPropertyChanged 表示必须在数据库中更新记录。

我是否真的必须将所有导入记录属性值与实体属性值进行比较,并且仅在它们不同时才分配给实体属性,以避免这些冗长的“无操作”更新?

编辑: Updated 属性的设置器生成的代码如下所示。我可以看到分配是无条件的,这就是为什么我要询问数据库的 UPDATE 语句的实际生成是否是有条件的。

set
{
    OnUpdatedChanging(value);
    ReportPropertyChanging("Updated");
    _Updated = StructuralObject.SetValidValue(value);
    ReportPropertyChanged("Updated");
    OnUpdatedChanged();
}

【问题讨论】:

    标签: .net entity-framework


    【解决方案1】:

    您使用生成的实体代码吗?它已经检查值是否相同:

    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 Id
    {
        get
        {
            return _Id;
        }
        set
        {
            if (_Id != value)
            {
                OnIdChanging(value);
                ReportPropertyChanging("Id");
                _Id = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("Id");
                OnIdChanged();
            }
        }
    }
    private global::System.Int32 _Id;
    partial void OnIdChanging(global::System.Int32 value);
    partial void OnIdChanged();
    

    【讨论】:

    • 请看我的编辑。为我生成的代码没有警卫。我的目标是 .NET 4.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多