Заставить Entity Framework вернуть новый экземпляр - PullRequest
1 голос
/ 21 февраля 2012

В нашем коде есть сценарий, когда разрешено изменять только несколько свойств объекта. Чтобы гарантировать это, у нас есть код, подобный этому:

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 всегда давать мне новый экземпляр класса клиентов?

Или вместо этого мы должны изменить код? Кто-нибудь знает какие-либо хорошие шаблоны проектирования для этого сценария?

1 Ответ

1 голос
/ 21 февраля 2012

Вы можете попробовать, отсоединив сущность от контекста, это удалит все ссылки на контекст (а также поведение карты идентичности). Итак, перед тем как передать Заказчику ваш метод, вы можете отключить его:

yourContext.Detach(customer);
...