コードには、エンティティのいくつかのプロパティのみを変更できるシナリオがあります。それを保証するために、次のようなコードがあります。
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 に顧客クラスの新しいインスタンスを常に与えるように強制することはできますか?
それとも、代わりにコードをリファクタリングする必要がありますか? このシナリオの優れた設計パターンを知っている人はいますか?