我有一个奇怪的行为。我想更新复杂类型的单个属性。当我指定要使用 IsModified 更新的属性时(有些属性为真,有些为假),我没有任何更新。如果我没有指定复杂类型的属性,则会更新复杂属性的每个字段。
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();