ASP.NET - 如何使用实体框架构建MVC3模型和视图?

时间:2012-01-31 09:48:02

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

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

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

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

示例

我的域模型的实体类型为“customer”,其属性为

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

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

  • 名称

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

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

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

我希望这个例子可以说明我所面临的问题。

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

2 个答案:

答案 0 :(得分:0)

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

在您的情况下:如果您的客户有身份证,姓名和生日,我无法想到两个并发用户会同时编辑客户并输入不同数据的常见情况。为什么一个用户会输入一个姓名或生日,而其他人同时输入不同的姓名或生日?

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

关于这个主题的非常好的文章:Udi Dahan的Race Conditions Don't Exist

答案 1 :(得分:0)

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

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

相关问题