ASP.NET MVC:存储库模式高并发更新

问题描述 投票:0回答:2

我正在编写一个应用程序,稍后我们可能会关闭存储库(当前为实体框架),以使用亚马逊或Windows Azure存储。

我有一个通过ID禁用用户的服务方法,它所做的全部就是将属性设置为true并设置DisabledDate。我应该调用存储库,获取该用户,在服务中设置属性,然后调用存储库中的save函数吗?如果这样做,那么多数民众赞成在2个数据库调用中,我应该为此担心吗?如果用户在管理员调用disable方法的同时更新配置文件,并调用用户调用存储库中的save方法(当前对IsDisabled属性持有false),该怎么办?如果在禁用方法之后立即调用,该如何启用?

解决此问题的最佳方法是什么?如何在高并发系统中更新数据?

asp.net-mvc entity-framework repository-pattern
2个回答
1
投票

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 you're using UoW 
}

应该用作存储库中的通用“ UPDATE”方法。仅在实体存在时使用。

这只是一个例子-实际上,您应该/应该使用泛型,在附加之前检查图中是否存在实体,等等。

但是那会让您走上正确的轨道。


1
投票

只要知道要保存的实体的ID,您就可以通过将实体首先附加到上下文中来做到这一点,就像这样:

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

无论是否建议使用此方法,由于我对EF不太熟悉,所以我不太确定,但这可以让您发出update命令而不必先加载实体。

© www.soinside.com 2019 - 2024. All rights reserved.