1

假设我有一个大实体并且想要创建一个典型的 CRUD 应用程序。用户不应该有能力保存我的实体的某些字段。

所以我看到了两种实现更改保存逻辑的方法:

一个)

  1. 从数据库中获取实体

  2. 包含所有字段的页面(用户不应更改为隐藏输入的字段)

  3. 通过 post 方法获取实体

  4. 附加到上下文并保存

在这种情况下,我需要在页面上删除无用的字段。毫无疑问,这很糟糕。

b)

  1. 从数据库中获取实体

  2. 出页仅必要的字段(用户可以更改的字段)

  3. 通过 post 方法获取实体

  4. 从数据库中获取实体

  5. 用新值填充数据库实体并保存

在这种情况下,我需要对 DB 进行额外的查询。所以对性能不好。

什么是正确的方法?

4

3 回答 3

2

或 C):

  1. 从数据库中获取实体
  2. 仅使用允许的字段将实体映射到 ViewModel
  3. 将带有数据的 ViewModel 发布回控制器
  4. 将 ViewModel 映射回实体
  5. 附加并保存。

编辑:我强烈推荐AutoMapper来回映射

于 2013-02-07T15:19:23.470 回答
1

有趣的是,我刚刚观看了 Julie Lerman 制作的视频,其中她讨论了几乎完全相同的问题。你的解决方案都不是她所采用的:

有一个单独的实体类,其中包含您要在屏幕上显示的字段,但仍映射到与常规表相同的表。然后只需查询该 DbSet 以获取实体(仅包含这些字段),并将更新保存到该实体。

她在讨论在实体框架之上实现领域驱动设计时提到了这一点。因此,如果您在应用程序中为不同的函数使用不同的 DbContext,您仍然可以使用正在使用的 DbContext 写入表,但您可以限制上下文可以写入的字段。

于 2013-02-07T15:20:33.703 回答
0

建议对ViewModels不同的任务使用不同的。如果您想向用户显示Model要编辑的某些字段,那么您可以使用EditModel和同时保存使用CreateModel来创建和填充数据库。这样,您可以避免用户知道您的数据库结构,从而确保保护和安全。

于 2013-02-07T15:17:52.063 回答