1

コードには、エンティティのいくつかのプロパティのみを変更できるシナリオがあります。それを保証するために、次のようなコードがあります。

public void SaveCustomer(Customer customer)
{
    var originalCustomer = dbContext.GetCustomerById(customer.Id);

    if (customer.Name != originalCustomer.Name)
    {
        throw new Exception("Customer name may not be changed.");
    }

    originalCustomer.Address = customer.Address;
    originalCustomer.City = customer.City;

    dbContext.SaveChanges();
}

このコードの問題は、 への呼び出しがクラスdbContext.GetCustomerByIdの新しいインスタンスを常に提供するとは限らないことです。Customer顧客がデータベースから既にフェッチされている場合、Entity Framework はインスタンスをメモリに保持し、その後のすべての呼び出しでそれを返します。

これは実際の問題につながります -customerそしてoriginalCustomer同じインスタンスを参照しているかもしれません. その場合、customer.Nameは等しくなりoriginalCustomer.Name、データベースと異なるかどうかを検出できません。

IDマップの設計パターンのため、他のほとんどのORMにも同じ問題が存在すると思います。

これを解決する方法はありますか?どうにかして EF に顧客クラスの新しいインスタンスを常に与えるように強制することはできますか?

それとも、代わりにコードをリファクタリングする必要がありますか? このシナリオの優れた設計パターンを知っている人はいますか?

4

1 に答える 1

1

エンティティをコンテキストから切り離して試すことができます。これにより、コンテキストへのすべての参照(およびIDマップの動作)が削除されます。したがって、Customerをメソッドに渡す前に、メソッドを切り離すことができます。

yourContext.Detach(customer);
于 2012-02-21T10:25:39.890 に答える