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, но это позволит вам выполнить команду обновления без необходимости сначала загружать объект.