如何在C#中将System.Data.Linq.Binary分配为null?

时间:2017-04-17 20:12:14

标签: c# sql-server hash linq-to-sql

我有一个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二进制列中正确分配空值?

1 个答案:

答案 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);
}