我有一个SQL Server表,其列NameHash
的类型为binary(16)
,允许空值。
在我的C#应用程序中,我有一个非常基本的MD5散列扩展方法:
public static byte[] CalculateMD5HashBinary(this string input)
{
if (String.IsNullOrEmpty(input))
{
return null;
}
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
return md5.ComputeHash(inputBytes);
}
我正在使用LINQ to SQL
来分配值:
var fooBar = MyContext.FooBars.First();
fooBar.NameHash = fooBar.Name.CalculateMD5HashBinary();
MyContext.SubmitChanges();
当Name
为空或为空时,NameHash
列应为null。但是,当我在数据库中保存此值时,我会检查我看到的十六进制字符串0x00000000000000000000000000000000
的值。
为什么这样做?如何在NameHash
二进制列中正确分配空值?
答案 0 :(得分:0)
在一些乱七八糟的事情之后我想出了这个。
LINQ-to-SQL
采用Binary(16)
SQL-Server类型,并在C#中使用System.Data.Linq.Binary
类型。
您可以将Byte[]
值分配给Binary
个变量并对这两个变量进行布尔比较,因此我可以互换使用它们。
我意识到我的返回类型Byte[]
的扩展方法是将{""}
设置为NameHash
值,而不是因为任何原因而为null。我将返回类型更改为Binary
,它解决了我的问题。
using System.Data.Linq;
public static Binary CalculateMD5HashBinary(this string input)
{
if (String.IsNullOrEmpty(input))
{
return null;
}
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
return md5.ComputeHash(inputBytes);
}