EF 更新对象只是因为属性更改还是仅当它具有不同的值时?

发布于 2024-09-16 14:00:40 字数 600 浏览 2 评论 0原文

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

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

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

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

I have an import, from flat file to an EDM against SQL Server, where very few records actually change (running it the umpteenth time with the same import file), but nonetheless the SaveChanges call to update 500 records takes quite long. I'm guessing this is because I set each property on the entity object, and EF then uses ReportPropertyChanged to signal that the record must be updated in the DB.

Do I actually have to compare all import recort property values to entity property values, and only assign to the entity property when they differ, to avoid these lengthy 'do-nothing' updates?

EDIT:
The generated code for the setter for the Updated property looks like below. I can see the assignment is unconditional, which is why I'm asking if the actual generation of an UPDATE statement to the DB is conditional or not.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜心小果奶 2024-09-23 14:00:40

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

[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();

Do you use generated entity code? It already checks if value is same:

[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();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文