ASP.NET MVC: высокий уровень параллелизма обновлений шаблона репозитория

Я пишу приложение, в котором мы, возможно, позже переключим хранилище (в настоящее время на платформу сущностей), чтобы использовать хранилище Amazon или Windows Azure.

У меня есть метод обслуживания, который отключает пользователя по идентификатору, все, что он делает, это устанавливает для свойства значение true и устанавливает DisabledDate. Должен ли я позвонить в хранилище, получить этого пользователя, установить свойства в службе, а затем вызвать функцию сохранения в хранилище? Если я сделаю это, то это будет 2 вызова базы данных, я должен беспокоиться об этом? Что если пользователь обновляет профиль в то же время, когда администратор вызывает метод отключения и вызывает пользователя, вызывает метод save в репозитории (который в настоящее время содержит значение false для свойства IsDisabled?). быть включенным, если вызывается сразу после отключенного метода?

Как лучше всего решить эту проблему? Как обновить данные в системе с высоким уровнем одновременности?

2 ответа

Решение

CustomerRepository:

// Would be called from more specific method in Service Layer - e.g DisableUser
public void Update(Customer c)
{
   var stub = new Customer { Id = c.Id }; // create "stub"
   ctx.Customers.Attach(stub); // attach "stub" to graph
   ctx.ApplyCurrentValues("Customers", c); // override scalar values of "stub"
   ctx.SaveChanges(); // save changes - 1 call to DB. leave this out if your using UoW 
}

Это должно служить универсальным методом "ОБНОВЛЕНИЕ" в вашем хранилище. Следует использовать только тогда, когда сущность существует.

Это всего лишь пример - в действительности вы должны / могли бы использовать дженерики, проверять существование сущности в графе перед присоединением и т. Д.

Но это поможет вам на правильном пути.

Если вы знаете идентификатор сущности, которую хотите сохранить, вы сможете сделать это, сначала прикрепив сущность к контексту, например так:

var c = new Customer();
c.Id = someId;
context.AttachTo("Customer", c)
c.PropertyToChange = "propertyValue";
context.SaveChanges();

Рекомендуется ли этот подход или нет, я не уверен, так как я не слишком знаком с EF, но это позволит вам выполнить команду обновления без необходимости сначала загружать объект.

Другие вопросы по тегам