Заставить Entity Framework вернуть новый экземпляр

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

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 ответ

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

yourContext.Detach(customer);
Другие вопросы по тегам