我在写与我们现有的会员基础,使用会员提供的过程。 我使用EF4.1为我所有的数据库访问和发行,我快到是当DB原本设置的关系是在数据库编程完成的,而不是之一。 需要一个。如果关系要在没有被要求为所有用户的列做,但为了使关系确实需要是唯一的(从我的理解)。
我的解决方案,我相信会的工作是做对用户ID字段中的MD5哈希(这是独一无二的......这将/应保证在该领域独特的价值)。 我正在SQL Server上遇到问题的部分是,将做到这一点,而无需更换存储在employeeNum字段(一个问题)的现有值查询。
所以,简单地说,我的问题是。 什么是让在一个独特的价值的最好方式employeeNum
场(可能基于在一个MD5哈希userid
字段)的所有行中的值是不存在的。 此外,为小/大程度上......这听起来是个不错的计划?
如果您的问题只是如何生成用户ID的哈希值,你可以做到这一点使用计算列这样(或产生这个值作为插入过程的一部分)。 这是我不清楚你是否了解HASHBYTES当你说功能还是什么其他条件你在寻找“最佳”。
DECLARE @foo TABLE
(
userid INT,
hash1 AS HASHBYTES('MD5', CONVERT(VARCHAR(12), userid)),
hash2 AS HASHBYTES('SHA1', CONVERT(VARCHAR(12), userid))
);
INSERT @foo(userid) SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 500;
SELECT userid, hash1, hash2 FROM @foo;
结果:
userid hash1 hash2
------ ---------------------------------- ------------------------------------------
1 0xC4CA4238A0B923820DCC509A6F75849B 0x356A192B7913B04C54574D18C28D46E6395428AB
2 0xC81E728D9D4C2F636F067F89CC14862C 0xDA4B9237BACCCDF19C0760CAB7AEC4A8359010B0
500 0xCEE631121C2EC9232F3A2F028AD5C89B 0xF83A383C0FA81F295D057F8F5ED0BA4610947817
在SQL Server 2012中,我强烈建议至少SHA2_256而不是上述任何一种的。 (你忘了提及你用的是什么版本 - 总是有用的信息)
说了这么多,我还是想提请注意我在评论中提出的观点:“最好”这里解决方法是修复模型。 如果employeeNum
是可选的,EF不应作出觉得这是必需的或独特的,它不应该在关系中使用,如果它不是,事实上,某种标识符。 为什么会约之间的碰撞用户关怀employeeNum
和userid
,如果您使用的是摆在首位的关系,正确的属性?
编辑的要求由OP
那么,什么是错说UPDATE table SET EmployeeNum = 1000000 + UserID WHERE EmployeeNum IS NULL
? 如果EmployeeNum
将保持低于1000000
那么你保证没有冲突,你已经完全避免散列。
你可以产生类似的填充如果employeeNum
可能包含一个字符串,但同样是EF促进这些可怕的列名? 为什么会用一列Num
后缀包含什么,但多少?
你也可以使用一个唯一标识符的默认值设置为(NEWID())
创建一个新的列EmployeeNum为uniqueidentifer,则:
UPDATE Employees SET EmployeeNum = newid()
然后设置作为主键。
UPDATE EMPLOYEE
SET EMPLOYEENUM = HASHBYTES('SHA1', CAST(USERID AS VARCHAR(20)))
WHERE EMPLOYEENUM IS NULL