gpt4 book ai didi

c# - Entity Framework 代码首先更新复杂类型的单个属性

转载 作者:行者123 更新时间:2023-11-30 20:02:53 25 4
gpt4 key购买 nike

我有一个奇怪的行为。我想更新复杂类型的单个属性。当我指定要使用 IsModified 更新的属性时(一些属性为 true,一些为 false),我没有更新任何内容。如果我没有指定复杂类型的属性,那么复杂属性的每个字段都会更新。

public class MyEntity
{
public MyComplexClass Property1 { get; set; }
}

//... The code below doesn't work, in fact it update nothing
var entityLocal = this.Set<MyEntity>().Local.SingleOrDefault(d => d.Id == entity.Id);
if (entityLocal == null)
{
entityLocal = this.Set<MyEntity>().Attach(entity);
}
this.ChangeTracker.Entries<MyEntity>().Single(d => d.Entity == entityLocal).State = EntityState.Modified;
this.Entry(entity).Property(s => s.Property1.SubProperty1).IsModified = true;
this.Entry(entity).Property(s => s.Property1.SubProperty2).IsModified = false;//This seam to remove all update of the complex type...?
this.SaveChanges();

这个产品:

update [dbo].[MyEntity]
set @p = 0
where (([Id] = @0))

如果我没有将 SubProperty2 的 IsModified 指定为 false,我在 SQL 分析器中有以下内容:

update [dbo].[MyEntity]
set [Property1_SubProperty1] = @0, [Property1_SubProperty2] = null
where (([Id] = @1))

为什么当我在某些属性上指定“IsModified”时没有任何更新?

编辑

经过几次尝试,我可以确认,如果我检查这两行,当复杂类型的 1 属性设置为 IsModified 为 False 时,整个复杂类型没有更新。

var entry = DatabaseContext.Entry(entity);
var namesOfChangedProperties = entry.CurrentValues.PropertyNames.Where(p => entry.Property(p).IsModified).ToArray();

如果我将任何属性设置为 True,没问题,但当 1 个属性设置为 false (IsModified) 时,整个 SubProperty 不在 namesOfChangedProperties 变量中。

编辑2

我尝试使用 ComplexProperty 得到相同的结果。

this.ChangeTracker.Entries<MyEntity>().Single(d => d.Entity == entityLocal).State = EntityState.Modified;
this.Entry(entity).ComplexProperty(s => s.Property1).Property(d => d.SubProperty1).IsModified = true;
this.Entry(entity).ComplexProperty(s => s.Property1).Property(d => d.SubProperty2).IsModified = false;
this.SaveChanges();

最佳答案

这是 EF 对复杂类型进行更改跟踪的方式的限制。 EF 不跟踪属性级别的更改,而是仅跟踪整个对象是否被修改。这是作为 EF1 的一部分内置且尚未删除的限制。一方面,对于那些确实想要更精细的更改跟踪的人来说,取消此限制会很好。然而,另一方面,将复杂对象视为不可变的“值类型”通常被认为是最佳实践。对于这样的值类型,整个对象总是被设置,这使得更细粒度的变化跟踪变得不那么有用。此外,更细粒度的更改跟踪并不是一个非常普遍要求的功能,因此 EF 团队不太可能很快就着手处理它。

关于c# - Entity Framework 代码首先更新复杂类型的单个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16026452/

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