1

我是 ASP.NET 的新手,所以我的问题可能很愚蠢,并且受到多年使用 Java/JSF 的影响。

我想使用带有 MVC3 和 Entity Framework 4.1 的 ASP.NET 来实现一个 Web 应用程序。由于它是一个业务应用程序,因此它应该通过防止数据操作和并发来保证安全。

因此,我计划使用实体框架支持的乐观锁定。但是当谈到使用 MVC 范式及其提供的选项时,我不确定如何实现上述安全方面。

例子

我有一个具有实体类型“客户”的域模型,它具有属性

  • ID(数据库PK)
  • 姓名
  • 生日
  • 版本(用于乐观锁定)

为了准备视图以编辑其数据,我另外使用具有以下属性的视图模型“customerView”

  • 姓名

在控制器中,我从数据库加载特定记录,将值传输到视图模型并将其放入强类型视图中。这很好用 - 值显示在 Web 表单中,我可以发回更改。由于视图模型不包括 ID 和版本(导致不是回发的一部分),我无法将值映射回域模型,因为它在请求-响应-生命周期期间丢失。

当然,我可以将 ID 和版本添加为隐藏的输入字段,因为它启用了数据操作,所以我想避免使用它。有人可能会在发回数据之前更改 ID 或版本,这可能会导致不良行为,因为我无法将发回服务器的数据与传递到 Web 表单的数据(尤其是 ID 和版本)进行比较。

我认为一种方法是存储我在会话中显示编辑视图之前获取的数据记录/域模型(或至少记录的 ID),以避免来回发送不需要的字段,尽管我知道这不是最好的方法并且可能会影响应用程序的性能。使用另一个会话状态然后使用默认状态,例如 SQL Server 怎么样?这将能够保存至少一个数据库操作,因为我不必再次从数据库中加载记录来传输视图模型中的值。我可以从会话中获取域模型记录,甚至可以检查数据操作。

我希望这个例子能说明我面临的问题。

也许有更好的方法来解决这些问题。也许我完全糊涂了;)

4

2 回答 2

0

当谈到竞争条件时,首先要问的问题应该是:并发活动实际导致无效记录的概率是多少?

在您的情况下:如果您有一个具有 ID、姓名和生日的客户,我想不出一个常见的场景,即两个并发用户会同时编辑客户并输入不同的数据。为什么一个用户会输入一个名字或生日,而另一个用户会同时输入一个不同的名字或生日?

我想说的是:在大多数情况下,与锁定和类似保护手段所带来的努力和可用性损失以及性能相比,问题的可能性可以忽略不计。

关于该主题的一篇非常好的文章:Udi Dahan不存在种族条件

于 2012-01-31T10:00:51.733 回答
0

您必须在视图中包含您的 ID,没有其他方法。至于数据操作 - 您必须检查(在每次保存时)是否允许用户使用此 ID 修改对象。

版本戳也是如此,但在这种情况下,您不必担心数据操作,因为实际上没有手动生成与数据库中的时间戳匹配的时间戳,如果它们不匹配,则不会进行编辑,所以您'是安全的。或者,当您传递正在编辑的每个字段的原始值时,您可以切换执行其他并发检查方案。

于 2012-07-30T12:31:53.663 回答