【发布时间】:2011-03-30 06:11:44
【问题描述】:
我有必要让客户端应用程序“锁定”(也称为“签出”某些业务实体存储在数据库中。
工作流程是这样的:
用户导航到某个业务对象的页面。
用户点击“编辑”。
这会锁定项目,防止其他人编辑。
其他工作站上的其他用户会在正在编辑的项目旁看到一个小的“锁定”图标,并且“编辑”按钮将是只读的。
管理员用户可以点击按钮“强制”解锁项目。
相当标准,对吧?我过去已经做过很多次了,我正在寻找关于这次“正确”做法的一些想法......
也就是说,我想有两种方法:
让我的业务对象实现一些具有 LockOwnerId 属性的 ILockable 接口,并让数据库中的相应表具有相同的 LockOwnerId。
在数据库中有一个集中的“EntityLocks”表,用于管理当前锁定/签出的所有实体类型/主键对。
关于获取锁的 API,我只是在想一些类似于 CheckOut 方法的东西:
// Returns true if the check-out was successful,
// false if the check-out was not successful, becase the item was already locked. If
// force is set to true, will check out the toCheckOut to the current user, regardless
// of existing check-outs.
bool CheckOut(object toCheckOut, bool force)
想法?
谢谢。
【问题讨论】:
-
我知道您说的是 WebApplication。那么这将是非常困难的。只是因为用户可以点击编辑并离开您的页面,并且在会话到期之前您永远不会知道它是否仍在编辑。至少在会话期间锁定您的实体。
-
更好的是,我说的是一个同时具有 Web 前端和 Silverlight 客户端前端(通过 WCF 与服务器通信)的应用程序。
标签: c# .net database-design orm business-objects