在 SaveChanges() 上将集合项的属性覆盖回旧数据

Overwrites collection item's properties back to old data on SaveChanges()

我目前正在使用基于模型设计器的代码优先设计开发 MVVM 应用程序。到目前为止,我已经能够在单个实体上进行所有基本的 CRUD 操作,但是我似乎根本无法使用 SaveChanges() 更改集合对象的属性 - 我使用了 SQL 探查器看到它正在尝试使用旧值进行更新,并且在 SaveChanges() 之后的一步我的更改恢复为旧值!

一些其他信息:

这里有什么我可能遗漏的吗?这是我尝试过的一种尝试: // 分配一个包含关系的索引对象 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) 围绕这个的测试用例只实现了被错误标记的相同属性,使得 看起来 所有更改都被还原 - 导致对问题所在的混淆代码实际上是。如果另一个专栏被修改并与其他专栏一起观看,这可能会更快被发现。