Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C代码上引用域表的数据库注册表?_C#_Design Patterns_Database Design - Fatal编程技术网

C# 如何在C代码上引用域表的数据库注册表?

C# 如何在C代码上引用域表的数据库注册表?,c#,design-patterns,database-design,C#,Design Patterns,Database Design,我的问题是: 我在数据库中有一个域表,我在其中为用户添加了一些规则 大概是这样的: bool HasPermissionToEdit = Rules.UserHasPermisson(UserName, UserRoles.CanEditClient) if(HasPermissionToEdit) { //Do the work! } 表用户角色: idRule cRuleDescription bRuleIsActive 1 Edit client true 2 D

我的问题是:

我在数据库中有一个域表,我在其中为用户添加了一些规则

大概是这样的:

bool HasPermissionToEdit = Rules.UserHasPermisson(UserName, UserRoles.CanEditClient)

if(HasPermissionToEdit)
{
  //Do the work!
}
表用户角色:

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!
}
但是使用这个会给我带来一些麻烦。有人在数据库的生产环境中创建了新行。身份证也不正确了。我需要更改C代码的枚举。我需要使用此表,因为管理用户可以管理其他用户组的规则


你是如何使用它的?有更好的方法来引用表上的注册表吗?

只要规则ID不是自动生成的(即不是标识列),使用规则ID映射到枚举本身就不疯狂。

只要规则ID不是自动生成的,使用规则ID映射到枚举本身就不疯狂(即,不是一个标识列)。

如果要正确执行此操作,请使密钥包含角色的名称。这样,就不会出现ID意外,因为有人认为密钥没有意义。将其命名为idRule没有帮助

其次,添加检查约束以强制正确使用角色名称

第三,在角色名称上添加唯一的键约束,以强制每个角色只出现一次

如果愿意,可以使用字符串枚举将角色名转换为整数。有关良好的设计模式,请参阅

示例表:

ID-名称-描述-处于活动状态
1-CanEditClient-client-true
2-CanDeleteClient-client-false
3-CanChangeClientName-客户端-真

然后确保为名称添加唯一约束,并同时添加检查约束


现在,无论有人如何洗牌ID,您的代码都将继续工作。

如果您想正确实现这一点,请使密钥包含角色的名称。这样,就不会出现ID意外,因为有人认为密钥没有意义。将其命名为idRule没有帮助

其次,添加检查约束以强制正确使用角色名称

第三,在角色名称上添加唯一的键约束,以强制每个角色只出现一次

如果愿意,可以使用字符串枚举将角色名转换为整数。有关良好的设计模式,请参阅

示例表:

ID-名称-描述-处于活动状态
1-CanEditClient-client-true
2-CanDeleteClient-client-false
3-CanChangeClientName-客户端-真

然后确保为名称添加唯一约束,并同时添加检查约束


现在,不管有人如何洗牌ID,你的代码都会继续工作。

是的。我看到很多开发人员都在这么做。我就是其中之一。但我认为这不安全。因为有人可以更改数据库,映射会出错。但我看不到其他方法来实现这一点。你总是必须映射到某个东西,它可能就是它可能的IDt是描述或另一个字符串字段。在动态系统(DB)中有一段数据,在静态系统(代码)中有一段数据这一事实上,您总是会遇到问题.Mapping to a integer field是整洁的,因为您可以将该字段强制转换为枚举。是的。我看到很多开发人员都这么做。我就是其中之一。但我认为这不安全。因为有人可以更改数据库,映射将出错。但我看不到其他方法来完成此操作。您将始终必须映射到某个对象,它可能是ID是描述字段还是另一个字符串字段。动态系统(DB)中有一段数据,静态系统(代码)中有一段数据这一事实总是会有问题的。映射到整数字段是整齐的,因为您可以将字段强制转换为枚举。