В нашем коде есть сценарий, когда разрешено изменять только несколько свойств объекта. Чтобы гарантировать это, у нас есть код, подобный этому:
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
, и мы не сможем определить, отличается ли он от базы данных.
Я полагаю, что та же проблема существует и с большинством других ORM из-за шаблона проектирования карты идентификации.
Есть идеи, как это можно решить? Могу ли я как-то заставить EF всегда давать мне новый экземпляр класса клиентов?
Или вместо этого мы должны изменить код? Кто-нибудь знает какие-либо хорошие шаблоны проектирования для этого сценария?