gpt4 book ai didi

entity-framework - Entity Framework : Cancel a property change if no change in value

转载 作者:行者123 更新时间:2023-12-04 08:35:20 25 4
gpt4 key购买 nike

在实体对象上设置属性时,它会将值保存到数据库中,即使该值与以前完全相同。有没有办法防止这种情况发生?

例子:

如果我加载一个电影对象并且标题是“A”,如果我再次将标题设置为“A”并且 SaveChanges() 我希望我不会在 SqlProfiler 中看到 UPDATE 语句,但我是。有没有办法阻止这一切?

最佳答案

是的,你可以改变这个。但是,在 Entity Framework 的当前版本中,这样做并非易事。将来会变得更容易。

您看到此行为的原因是实体模型的默认代码生成。这是一个有代表性的例子:

public global::System.Guid Id
{
get
{
return this._Id;
}
set
{
// always!
this.OnIdChanging(value);
this.ReportPropertyChanging("Id");
this._Id = global::System.Data.Objects.DataClasses
.StructuralObject.SetValidValue(value);
this.ReportPropertyChanged("Id");
this.OnIdChanged();
}
}
private global::System.Guid _Id;
partial void OnIdChanging(global::System.Guid value);
partial void OnIdChanged();

此默认代码生成是合理的,因为 Entity Framework 不知道您打算如何使用这些值的语义。属性中的类型可能具有可比性,也可能不具有可比性,即使它们是可比的,框架也无法知道您打算如何在所有情况下使用引用相等与值相等。对于像十进制这样的某些值类型,这很清楚,但在一般意义上它并不明显。

另一方面,您知道您的代码,并且可以对其进行一些自定义。麻烦的是这是生成的代码,所以不能直接进去编辑。您需要接管代码生成,或者使其变得不必要。那么让我们来看看这三个选项。

接管代码生成

此处的基本方法是创建一个 T4 模板,该模板执行后面的代码,并从 Entity Framework 生成默认代码。 Here is one example.这种方法的一个优点是 the Entity Framework will be moving to T4 generation in the next version ,因此您的模板可能会在以后的版本中运行良好。

消除代码生成

第二种方法是完全消除热电联产, do your change tracking support manually, via IPOCO .使用这种方法,您无需更改代码的生成方式,根本不进行任何代码生成,而是通过实现多个接口(interface)为 Entity Framework 提供更改跟踪支持。有关更多详细信息,请参阅链接的帖子。

等待

另一种选择是暂时使用 Entity Framework ,并等到下一个版本获得您想要的行为。 The next version of the Entity Framework will use T4 by default ,因此自定义代码生成将非常容易。

关于entity-framework - Entity Framework : Cancel a property change if no change in value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/463799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com