Entity Framework Code First を使用しており、必要のないときに Insert、Update、および Delete のエンティティの変更をロールバックしようとして問題が発生していSaveChanges()
ます。
具体的には、いくつかの補助テーブルを変更するために、TableEditor として使用している datagridview があります。datagridview は にバインドされていDbSet<TEntity>
ます。
Update のロールバックは正常に機能しているようです。currentValues を OriginalValues に戻すように設定し、状態を に変更しunchanged
ます。
レコードがグリッドビューに挿入されると (ただし、変更は保存されません)、エンティティ クラスには表示されず、二度と表示されません...だから、dbSet に到達しないと思います。ロールバックはありません。これに必要ですか?
しかし、私の主な問題は Delete にあります:
私が理解していることから、レコードが「削除」されると (例: )、 SaveChanges が呼び出されるまで、tableData.Remove(currentItem);
単に削除対象としてマークされます。State をdeleted
back からに変更するunchanged
と、ロールバックが処理されるはずですよね?
レコードは再び表示されますが、レコードのナビゲーション プロパティは失われています。(つまり、外部キーと他のエンティティとの必要な関係を含む列)。どうしてこれなの??!
これが私がこれまでに持っているものです:
public void RollbackChanges(DbEntityEntry entry)
{
if (entry.State == EntityState.Modified)
{
foreach (var propertyName in entry.OriginalValues.PropertyNames)
{
entry.CurrentValues[propertyName] = entry.OriginalValues[propertyName];
}
entry.State = EntityState.Unchanged;
}
else if (entry.State == EntityState.Deleted)
{
entry.State = EntityState.Unchanged;
}
else if ((entry.State == EntityState.Added) || (entry.State == EntityState.Detached))
{
MessageBox.Show("I don't think this ever happens?");
}
}
使用例:
foreach (var entity in db.CertificationDecisions)
{
DbEntityEntry entry = db.Entry(entity );
if (entry.State != EntityState.Unchanged)
{
RollbackChanges(entry);
}
}
ナビゲーション プロパティがレコードから消える理由はありますか? (または、それらを取り戻すために何ができますか?)
編集: 使用に関する@Chris
Refresh
:
私はDbContextを使用しているので、ロールバック メソッドを次の行に置き換えました。
((IObjectContextAdapter)db).ObjectContext.Refresh(RefreshMode.StoreWins, db.CertificationDecisions);
ただし、レコードがまだ欠落しているため、これはコンテキストをリロードしていないようです...Refresh
間違って使用していますか?
これは私の問題の可能な解決策のように思えますが、なぜナビゲーション プロパティが削除されるのか疑問に思っています。