【问题标题】:ASP.NET - How to structure MVC3 models and views using the Entity Framework?ASP.NET - 如何使用实体框架构建 MVC3 模型和视图?
【发布时间】:2012-02-23 01:01:53
【问题描述】:

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

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

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

示例

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

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

为了让视图为编辑数据做好准备,我还使用了具有以下属性的视图模型“customerView”

  • 姓名

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

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 entity-framework domain-model


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      关于该主题的一篇非常好的文章:Udi Dahan 的Race Conditions Don't Exist

      【讨论】:

      • 感谢您的回答。正如我所说,这只是一个简单的例子。我明白你的意思,但通常你必须记住,即使概率很小,当问题发生时,软件或公司的声誉也可能会受到严重影响。另外这个软件可能会受到审计,所以我更愿意在之前处理这些问题。
      • 我理解您的担忧。我可能听起来像个政治家,但恐怕你的问题的唯一答案是:这取决于。没有最佳实践或规范的解决方案,尤其是在安全性、可靠性和一致性方面。您可能想研究 CQRS,这是一种固有地处理多个用户并可以提供故障安全审计机制的架构模式。一个好的起点是cqrs.wordpress.com/documentsabdullin.com/cqrs
      猜你喜欢
      • 2012-07-03
      • 2011-09-08
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多