2

次のシナリオがあります。

ここからリポジトリパターンと作業単位でEFを使用しています

次に、部分クラスを拡張し、GetAll およびその他のメソッドを持つ Finder クラスを作成しました。これは以下で見ることができます:

ここに画像の説明を入力

以下では、すべてのクラスのリポジトリで作業単位クラスを使用して、汎用リポジトリからインスタンスを取得していることがわかります。

ここに画像の説明を入力

protected Repository<Category> _CategoryRepository;
public Repository<Category> CategoryRepository
{
    get { return _CategoryRepository ?? (_CategoryRepository = new Repository<Category>(context)); }
}

このように、私はさまざまなリポジトリを持っていました.dbからエンティティを取得して別のコンテキストから更新すると、問題が発生しました。そこで、このメソッドを使用してコンテキストの有効期間管理を行いました。そして、それはその問題を解決しました。

今私が直面している問題は、次のコードにあります。

var cat = Instance.Category.GetSingle(c => c.CategoryID == 7);

var orignal = cat.CategoryName;

var expected = cat.CategoryName + " Test Catg Update";

cat.CategoryName = expected;

cat.Update(); //This doesn't actually update due to a validation in place (which is correct)

cat = Instance.Category.GetSingle(c => c.CategoryID == 7);

Assert.AreEqual(cat.CategoryName, expected);

Update を使用していて、その中にいくつかのバリデーターがあり、Update が失敗した場合 (たとえば、文字列のサイズが 15 文字を超えているため)。GetSingle (上記のコードの最後の 2 行目) を再度呼び出そうとすると、同じ古いレコード [cat.CategoryName + "Test Catg Update"] が表示されます。これは通常の方法ですか?そうでない場合は、データベースからオブジェクトをリロードできるようにこれを修正できますか。

他のコードや参照が必要な場合はお知らせください。

4

1 に答える 1

1

メソッドでUpdate()、検証が失敗した場合は、エンティティの状態を に設定するだけEntityState.Unchangedです。内部的には、エンティティの状態を Modified から Unchanged に変更すると、最初にすべてのプロパティの値がクエリ時にデータベースから読み取られた元の値に設定され、次にエンティティが Unchanged としてマークされます。これにより、FK の元の値が復元されるため、FK 関係への変更も拒否されます。

ObjectContext.Refresh() メソッドを利用してこれを処理できる場合もあります。ただし、これは ObjectContext 上にあるため、UoW でそれを処理するメソッドが必要になります。リフレッシュ方法は次のようになりますcontext.Refresh(RefreshMode.ServerWins, entity);

于 2013-08-16T20:39:27.630 に答える