我的问题是:
我在数据库中有一个域表,在其中我为用户添加了一些规则。
类似这样的东西:
表用户角色:
idRule cRuleDescription bRuleIsActive
1 Edit client true
2 Delete client false
我的C#应用程序使用枚举引用这个表,如下所示:
public enum UserRoles: int
{
CanEditClient = 1,
CanDeleteClient = 2,
CanChangeClientName = 3,
//More code
}
我使用了一个C#方法,根据数据库的Id查询数据库,以了解记录的用户是否有权限执行某些操作。类似这样的东西:
bool HasPermissionToEdit = Rules.UserHasPermisson(UserName, UserRoles.CanEditClient)
if(HasPermissionToEdit)
{
//Do the work!
}
但是使用这个会给我带来一些麻烦。有人在数据库的生产设备中创建了新行。ID不再正确。我需要更改C#代码上的枚举。我需要使用这个表,因为管理用户可以管理其他用户组的规则。
你是如何使用它的?有更好的方法引用表上的注册表吗?
如果您想正确实现这一点,请使键包含角色的名称。这样一来,就不会出现有人认为钥匙毫无意义的身份证事故。将其命名为idRule没有帮助。
其次,添加一个检查约束来强制正确使用角色名称。
第三,在角色的名称上添加一个唯一的键约束,以强制每个角色只出现一次。
如果你愿意,你可以使用字符串枚举将角色名称转换为整数。请参阅C#字符串枚举以获得一个不错的设计模式。
示例表:
ID-名称-说明-IS_ACTIVE
1-CanEditClient-client-true
2-CanDeleteClient-client-false
3-CanChangeClientName-client-true
然后确保向NAME添加一个唯一约束,并添加一个检查约束。
现在,无论有人如何篡改ID,您的代码都将继续工作。
使用规则ID映射到枚举本身并不疯狂,只要规则ID不是自动生成的(即不是identiy列)。