エンティティ フレームワークを使用して、N 層の Wpf アプリケーションでデータを永続化しています。私の dbcontext はすべてのリポジトリ間で共有され、破棄されることはありません。データを永続化するとき、オブジェクトを変更済みとしてマークし、変更を保存しようとします。オブジェクトの永続化中にエラーが発生した場合、オブジェクトは変更済みとしてマークされたままになり、ユーザーが現在の操作を中止すると、別のオブジェクトを保存するときに同じエラーが発生します。
dbcontext で SaveChanges をオーバーライドすることでこれを解決しました。エラーが発生した場合は、すべての変更を受け入れます (以下のコードを参照)。そのため、オブジェクトにエラーが発生し、すべてのオブジェクトが永続化されていなくても、変更されていないとマークされます。
これは正しくありません...この解決策に同意する人はいますか? 別の解決策は、リポジトリの各メソッドで dbcontext を新しくし、すぐに破棄することです。これにより、リポジトリがより複雑で「うるさい」ものになり、データを遅延ロードする機能も失われます... 誰か別の解決策がありますか?
//In my repositories
public void UpdateObject(Object object)
{
dbContext.Entry(object).State = EntityState.Modified;
dbContext.SaveChanges();
}
//In my dbcontext class
private ObjectContext ObjectContext()
{
return (this as IObjectContextAdapter).ObjectContext;
}
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (Exception)
{
ObjectContext().AcceptAllChanges();
throw;
}
}