在 SaveChanges() 上将集合项的属性覆盖回旧数据
Overwrites collection item's properties back to old data on SaveChanges()
我目前正在使用基于模型设计器的代码优先设计开发 MVVM 应用程序。到目前为止,我已经能够在单个实体上进行所有基本的 CRUD 操作,但是我似乎根本无法使用 SaveChanges()
更改集合对象的属性 - 我使用了 SQL 探查器看到它正在尝试使用旧值进行更新,并且在 SaveChanges()
之后的一步我的更改恢复为旧值!
一些其他信息:
- 我的
dbContext
使用来自 PRISM/Unity 的 DI 加载并作为 "details" 页面的工作单元保存,用户将编辑然后保存。
- 我的 WPF UI 绑定正确,可以修改对象级别的更改。
- 我可以成功使用
Add()
插入实体。
- 我已经通过设置和简化调试验证了子集合中实体的实体状态已修改。
- 我已尝试对任何或所有项目手动
Attach()
和 AddOrUpdate()
。
- 我已关闭所有延迟加载,而是手动包含所有集合。
- 我已将
IsModified
和 CurrentValue 的 Entry()
属性手动设置为所需的设置。
- 我试过将我的 VM 属性绑定到他们的数据
dbContext.Classes.Local.ToBindingList()
或 new ObservableCollection<Class>(Entity.Property)
.
这里有什么我可能遗漏的吗?这是我尝试过的一种尝试:
// 分配一个包含关系的索引对象
Index = await _model.PersonIndexes.Include(i => i.PersonAddresses).FirstAsync(i => i.Id == IndexId);
// Grabbing a filtered set of Addresses based on their data
var query = Index.PersonAddresses.Where(e => e.Condition == true );
Addresses = new ObservableCollection<PersonAddress>(await query.ToListAsync());
// Ensure state is tracked (I've tried with and without all combinations of these)
foreach (PersonAddress addr in Addresses)
{
//_model.PersonAddresses.AddOrUpdate(a => a.Id, addr);
if (addr.PendingRemoval)
{
_model.PersonAddresses.Attach(addr);
_model.Entry(addr).Property(a => a.PendingRemoval).CurrentValue = true;
_model.Entry(addr).Property(a => a.PendingRemoval).IsModified = true;
}
}
// Saving (after this line the properties of the entities in the related collection get reverted to their old values - i.e. if I change a phone number in the UI, the save below will replace the new values with the previous number.
await _model.SaveChangesAsync();
所以事实证明这是一个不幸的配置错误和一个糟糕的巧合:
1) 检查您的模型和服务器架构以确保它们同步(尤其是在使用 EF 生成的代码时)。就我而言,它们不是,这导致...
2) SaveChanges()
正在覆盖我的相关属性,因为我没有注意到它们在我的模型代码中被错误地设置为 StoredGeneratorPattern
设置为 Computed
。这导致更改的值被忽略和覆盖。
3) 围绕这个的测试用例只实现了被错误标记的相同属性,使得 看起来 所有更改都被还原 - 导致对问题所在的混淆代码实际上是。如果另一个专栏被修改并与其他专栏一起观看,这可能会更快被发现。
我目前正在使用基于模型设计器的代码优先设计开发 MVVM 应用程序。到目前为止,我已经能够在单个实体上进行所有基本的 CRUD 操作,但是我似乎根本无法使用 SaveChanges()
更改集合对象的属性 - 我使用了 SQL 探查器看到它正在尝试使用旧值进行更新,并且在 SaveChanges()
之后的一步我的更改恢复为旧值!
一些其他信息:
- 我的
dbContext
使用来自 PRISM/Unity 的 DI 加载并作为 "details" 页面的工作单元保存,用户将编辑然后保存。 - 我的 WPF UI 绑定正确,可以修改对象级别的更改。
- 我可以成功使用
Add()
插入实体。 - 我已经通过设置和简化调试验证了子集合中实体的实体状态已修改。
- 我已尝试对任何或所有项目手动
Attach()
和AddOrUpdate()
。 - 我已关闭所有延迟加载,而是手动包含所有集合。
- 我已将
IsModified
和 CurrentValue 的Entry()
属性手动设置为所需的设置。 - 我试过将我的 VM 属性绑定到他们的数据
dbContext.Classes.Local.ToBindingList()
或new ObservableCollection<Class>(Entity.Property)
.
这里有什么我可能遗漏的吗?这是我尝试过的一种尝试: // 分配一个包含关系的索引对象 Index = await _model.PersonIndexes.Include(i => i.PersonAddresses).FirstAsync(i => i.Id == IndexId);
// Grabbing a filtered set of Addresses based on their data
var query = Index.PersonAddresses.Where(e => e.Condition == true );
Addresses = new ObservableCollection<PersonAddress>(await query.ToListAsync());
// Ensure state is tracked (I've tried with and without all combinations of these)
foreach (PersonAddress addr in Addresses)
{
//_model.PersonAddresses.AddOrUpdate(a => a.Id, addr);
if (addr.PendingRemoval)
{
_model.PersonAddresses.Attach(addr);
_model.Entry(addr).Property(a => a.PendingRemoval).CurrentValue = true;
_model.Entry(addr).Property(a => a.PendingRemoval).IsModified = true;
}
}
// Saving (after this line the properties of the entities in the related collection get reverted to their old values - i.e. if I change a phone number in the UI, the save below will replace the new values with the previous number.
await _model.SaveChangesAsync();
所以事实证明这是一个不幸的配置错误和一个糟糕的巧合:
1) 检查您的模型和服务器架构以确保它们同步(尤其是在使用 EF 生成的代码时)。就我而言,它们不是,这导致...
2) SaveChanges()
正在覆盖我的相关属性,因为我没有注意到它们在我的模型代码中被错误地设置为 StoredGeneratorPattern
设置为 Computed
。这导致更改的值被忽略和覆盖。
3) 围绕这个的测试用例只实现了被错误标记的相同属性,使得 看起来 所有更改都被还原 - 导致对问题所在的混淆代码实际上是。如果另一个专栏被修改并与其他专栏一起观看,这可能会更快被发现。