【问题标题】:Approving changes to live data using Entity Framework使用实体框架批准对实时数据的更改
【发布时间】:2011-06-21 12:32:57
【问题描述】:

我有一个要求,只有超级管理员才能修改“实时”数据。

目前,如果普通管理员想要对实时数据进行更改:-

  1. 超级管理员取消发布数据
  2. 普通管理员进行更改
  3. 超级管理员批准更改并发布数据

如果我想尝试消除第 1 步并在超级用户批准更改之前保持旧数据保持有效,我有哪些选择?

我正在使用 ASP.NET MVC 和 EF4,因此我对围绕 EF 的解决方案特别感兴趣,这些解决方案可以对我的控制器透明,但是我也有兴趣了解数据库层中的解决方案(或完全不同的上下文)

【问题讨论】:

  • 您能否提供有关您的数据库设计的信息,其中将发布哪些(哪些字段)和关系以及需要批准?
  • 我更多的是寻找通用解决方案,而不是特定于模式的解决方案。解决方案适用于某些实体而不适用于其他实体是否有特殊原因?
  • EF 提供了自定义生成代码并在保存之前验证更改的方法。但是您的批准逻辑等是业务逻辑,而 EF 只是一个数据访问层。此外,管理员如何可视化未经批准的更改,这也是业务逻辑的一部分。单个项目没有问题,但对象层次结构很难概括。
  • Mvc 之上的东西很好。我不想让我的 XController 知道超级管理员保存 X 和普通管理员提交更改以供批准之间的区别。显然,其他地方的另一个控制器将不得不处理批准先前更改的超级管理员。如果你能给出一个简单的对象图上的解决方案示例,可能会这样做。

标签: .net database entity-framework


【解决方案1】:

首先,由于您在谈论基于角色的活动,我发现很难提出不涉及应用程序/业务层的适当解决方案。我相信您的数据访问层应该忽略超级管理员或普通管理员正在调用其方法的事实。

在任何情况下,处理此问题的一种方法是创建一个 PendingChanges 表并保存普通管理员对其所做的更改,并带有一个表明它正在等待批准的标志。然后,一旦超级管理员批准它,您将记录从 PendingChanges 复制到实时表中。

【讨论】:

  • 我编辑了措辞。理想情况下,我希望将这个问题排除在控制器之外——要么在上下文对象中处理它,要么在服务层中处理它。
【解决方案2】:

我将尝试给出一个简单的对象图示例。

考虑一个具有以下结构的博客。

Posts
  PostID
  Title
  Description

PostUpdates
  PostUpdateID
  PostID
  Title
  Description
  DateUpdated
  UpdatedBy
  ApprovedBy
  PostStatus(Approved/Rejected)

这里我的逻辑是显示 Post 以及它的 Last Updated 和 Approved PostUpdate。现在在这种情况下,实际上没有任何东西被修改过。总是附加一组新的更改,您可以决定删除旧版本。

对于保存,您在 PostUpdates 中添加一个新的 PostUpdate 条目。

对于超级管理员,您可以显示所有更新并让他批准正确的更新。当管理员决定批准更新时,将使用上次批准的 PostUpdate 的内容修改 Post。

另一种选择(更通用)

您可以如下创建表,

RowUpdates
   RowUpdateID
   TableName
   TableKey
   NewValues (kind of XML store to save which fields were modified)
   UpdatedBy
   ApprovedBy
   DateUpdated
   UpdateStatus (Approved/Rejected)

但在这种情况下,您将不得不使用反射来避免将值存储到数据库,而是创建新的 RowUpdate 条目,并且只有在管理员批准的情况下,才能在进行反射映射后将实际值发布到数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2014-07-12
    • 2018-12-03
    相关资源
    最近更新 更多