Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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#_Sql_Database_Primary Key - Fatal编程技术网

C# 应用程序中的硬编码主键值

C# 应用程序中的硬编码主键值,c#,sql,database,primary-key,C#,Sql,Database,Primary Key,大家好,我是在我的项目中遇到这种情况的,在我的项目中,人们硬编码应用程序中primarykey列的值。这是一个好的做法。在处理环境时,该记录的值可能会改变,但如何将标识插入到其他环境中呢 虽然这显然是一种非常糟糕的做法,但如果没有关于推理的合理信息,我会犹豫拒绝这样的做法。我通常会让我的同事从怀疑中受益,并假设他们已经考虑过这个问题并得出了一个合理的结论,我只需要学习理解他们的推理 在某些非常罕见的情况下,硬编码标识可以是一个正常的解决方案,例如,如果您的安装包还创建了数据库和架构,并为某些域查

大家好,我是在我的项目中遇到这种情况的,在我的项目中,人们硬编码应用程序中primarykey列的值。这是一个好的做法。在处理环境时,该记录的值可能会改变,但如何将标识插入到其他环境中呢

虽然这显然是一种非常糟糕的做法,但如果没有关于推理的合理信息,我会犹豫拒绝这样的做法。我通常会让我的同事从怀疑中受益,并假设他们已经考虑过这个问题并得出了一个合理的结论,我只需要学习理解他们的推理

在某些非常罕见的情况下,硬编码标识可以是一个正常的解决方案,例如,如果您的安装包还创建了数据库和架构,并为某些域查找值设置种子,那么它们在每个系统上都是相同的。在此类情况下,标识列使用略高于通常值的种子定义,例如,标识100,1,并且系统值始终放在种子下面(在这种情况下为100)

例如,您可能有一个PhoneType域表,值1-3保留给Primary、Billing和Contact。同时,允许终端用户定义自己的电话类型


在运行时正确插入硬编码的标识值(例如响应用户输入)显然是一种不好的做法。在这种情况下,最好是找到一个自然密钥,使用GUID,或者开发自己的身份跟踪系统。

虽然这显然是一个非常糟糕的做法,但如果没有合理的推理信息,我会毫不犹豫地拒绝这样的做法。我通常会让我的同事从怀疑中受益,并假设他们已经考虑过这个问题并得出了一个合理的结论,我只需要学习理解他们的推理

在某些非常罕见的情况下,硬编码标识可以是一个正常的解决方案,例如,如果您的安装包还创建了数据库和架构,并为某些域查找值设置种子,那么它们在每个系统上都是相同的。在此类情况下,标识列使用略高于通常值的种子定义,例如,标识100,1,并且系统值始终放在种子下面(在这种情况下为100)

例如,您可能有一个PhoneType域表,值1-3保留给Primary、Billing和Contact。同时,允许终端用户定义自己的电话类型


在运行时正确插入硬编码的标识值(例如响应用户输入)显然是一种不好的做法。在这种情况下,最好是找到一个自然密钥,使用GUID,或者开发自己的身份跟踪系统。

通常,我在代码库中看到了一些常量,比如一些基本系统类型的枚举,这些类型对于数据库中作为查找表的应用程序非常重要。有一些更好的方法来处理这个问题,但最终,在这些情况下,某些东西总是会被硬编码,即使它不是主键。例如,主键可能是自然键

通常,您只会看到这对于非常基本的实体是可接受的。可能是程序中的一种组织或实体,如:type\u USER,type\u GROUP。对于通常可由用户修改的查找,或期望可扩展的查找,或在某些方面不是基本的查找,如VEHICLE_TYPE_CAR、VEHICLE_TYPE_SUV、VEHICLE_TYPE_RV、VEHICLE_TYPE_MOTORCYCLE等,您将看不到这一点


无论如何,这是一种代码气味,除非它是体系结构中基本的不可变枚举,否则这不是一个好主意。

通常我在代码库中看到了一些常量,比如一些基本系统类型的枚举,这些类型对于数据库中作为查找表的应用程序是基本的。有一些更好的方法来处理这个问题,但最终,在这些情况下,某些东西总是会被硬编码,即使它不是主键。例如,主键可能是自然键

通常,您只会看到这对于非常基本的实体是可接受的。可能是程序中的一种组织或实体,如:type\u USER,type\u GROUP。对于通常可由用户修改的查找,或期望可扩展的查找,或在某些方面不是基本的查找,如VEHICLE_TYPE_CAR、VEHICLE_TYPE_SUV、VEHICLE_TYPE_RV、VEHICLE_TYPE_MOTORCYCLE等,您将看不到这一点


在任何情况下,这都是一种代码味道,除非它是体系结构中基本的不可变枚举,否则这不是一种好的做法。

我同意这里到目前为止的所有答复,并且我还面临某些情况,需要检查基于主键的特定值的条件。正如Siyual所说,对照一个更具解释性的字段检查这种情况会使 这更有道理

处理这种情况的一种方法是在描述行的实体中添加另一列,并将其用作映射到枚举的条件检查

e、 g.表:

+-----+----------+-------------+
| PK  |  Status  | Enum_mapped |
+-----+----------+-------------+
| 101 | Fitted   |           1 |
| 201 | Unfitted |           2 |
| 301 | Used     |           3 |
+-----+----------+-------------+
代码:

调用相应的状态:

GetStatus((int)Statuses.Fitted);

Result=101

我同意到目前为止这里的所有回复,并且我还面临某些情况,需要检查基于主键的特定值的条件。正如Siyual所说,对照更具解释性的字段检查这种情况更有意义

处理这种情况的一种方法是在描述行的实体中添加另一列,并将其用作映射到枚举的条件检查

e、 g.表:

+-----+----------+-------------+
| PK  |  Status  | Enum_mapped |
+-----+----------+-------------+
| 101 | Fitted   |           1 |
| 201 | Unfitted |           2 |
| 301 | Used     |           3 |
+-----+----------+-------------+
代码:

调用相应的状态:

GetStatus((int)Statuses.Fitted);

Result=101

不,硬编码标识值从来都不是一个好主意。如果应用程序是以这种方式构建的,您建议继续这样做吗?不。如果应用程序已经以这种方式构建,我会在能够做到这一点后立即更改。对标识值进行硬编码(尤其是在您有多个环境的情况下)只是要求存在一个环境之间的值不匹配的问题。更不用说,在T.StatusId=S.Id,其中S.Name='InProgress'上执行类似于从某个表中选择*的操作会使您的意图100%清楚,而从StatusId=3的某个表中选择*只会产生更多的问题、困惑,最终会产生更多的工作来确定其意图。太棒了。谢谢你的回复。我真的很感谢你的帮助。不,硬编码标识值从来都不是一个好主意。如果应用程序是以这种方式构建的,你建议继续这样做吗?不。如果应用程序已经以这种方式构建,我会在能够做到这一点时立即更改。对标识值进行硬编码(尤其是在您有多个环境的情况下)只是要求存在一个环境之间的值不匹配的问题。更不用说,在T.StatusId=S.Id,其中S.Name='InProgress'上执行类似于从某个表中选择*的操作会使您的意图100%清楚,而从StatusId=3的某个表中选择*只会产生更多的问题、困惑,最终会产生更多的工作来确定其意图。太棒了。谢谢你的回复。我真的很感谢你的帮助。实际上我正在写一个应用程序,它将有一个活动,我有一个活动列表表。我有一个用于活动的控制台应用程序,现在我得到了一个执行方式不同的新活动。因此,我想在同一个控制台应用程序中标识该活动,以便为其提供不同的类和方法。您建议在活动表或活动名称中硬编码activityidPrimarykey吗?如果我使用GUID,您的意思是在不同的环境中保持相同的GUID吗?实际上,我正在编写一个将包含活动的应用程序,我有一个用于活动列表的表。我有一个用于活动的控制台应用程序,现在我得到了一个执行方式不同的新活动。因此,我想在同一个控制台应用程序中标识该活动,以便为其提供不同的类和方法。您建议在活动表或活动名称中硬编码activityidPrimarykey吗?如果我使用GUID,您的意思是在不同的环境中保持相同的GUID吗?