ASP.NET MVC: обновления с высокой степенью параллелизма в репозитории - PullRequest
0 голосов
/ 23 декабря 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

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 
}

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

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

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

1 голос
/ 23 декабря 2010

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

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

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

...