C# 将Linq To Sql二进制字段设置为null

C# 将Linq To Sql二进制字段设置为null,c#,linq-to-sql,varbinary,C#,Linq To Sql,Varbinary,尝试将二进制字段设置为null会导致ArgumentNull异常。 我可以将字段设置为空,如下所示newbinary(newbyte[]{})但那不是空的,只是一个空列。是否有使用LinqToSql的解决方法?您可以使用该方法传递自己的SQL。您确定该字段在数据库中可以为空吗?linq数据模型是否相应更新?如果使用基于属性的映射,则在[列(…)]属性中应该有一个CanBeNull=true设置。您还有其他事情要做。我刚刚创建了一个带有id(标识)、可为null的varbinary(MAX)、不可

尝试将二进制字段设置为null会导致ArgumentNull异常。
我可以将字段设置为空,如下所示
newbinary(newbyte[]{})但那不是空的,只是一个空列。是否有使用LinqToSql的解决方法?

您可以使用该方法传递自己的SQL。

您确定该字段在数据库中可以为空吗?linq数据模型是否相应更新?如果使用基于属性的映射,则在
[列(…)]
属性中应该有一个
CanBeNull=true
设置。

您还有其他事情要做。我刚刚创建了一个带有id(标识)、可为null的varbinary(MAX)、不可为null的varbinary(MAX)和时间戳的小样本表。使用以下代码工作正常,没有错误

using (var context = new TestDataContext())
{
    var binarySample = new BinarySample
    {
        Image = null,
        NonNullImage = new Binary( new byte[0] ),
    };
    context.BinarySamples.InsertOnSubmit( binarySample );
    context.SubmitChanges();
}
其中,由于此代码正确地抛出(并捕获)SQLException,而不是ArgumentNullException

try
{
    using (var context = new TestDataContext())
    {
        var binarySample2 = new BinarySample
        {
            NonNullImage = null,
            Image = new Binary( new byte[0] )
        };
        context.BinarySamples.InsertOnSubmit( binarySample2 );
        context.SubmitChanges();
    }
}
catch (SqlException e)
{
    Console.WriteLine( e.Message );
}
您是否有可能拥有一个分部类实现,该实现对引发ArgumentNullException的属性具有SendPropertyChange处理程序

编辑:基于OP的评论

请注意,您不能将byte[]类型的变量直接分配给二进制文件,因为它调用,而隐式转换将引发ArgumentNullException。在尝试赋值之前,应该检查该值是否为null,如果byte[]变量为null,则只需赋值null即可。对我来说,这似乎是一种奇怪的行为,我希望他们将来能改变它。MSDN文档表明未来版本中可能会发生一些更改。

@tvanfosson(作为获得更好的代码格式的答案发布)

是的,你是对的,有些奇怪的事情正在发生,我不知道

from.image缩略图是字节[] to.image缩略图是二进制的

使用?或如果我只使用if-else,操作符就不起作用了,真奇怪。我不明白为什么:-)


好的一点,如果在将表添加到Linq2SQL设计器时未将其定义为可空列,则需要从设计器中删除该表并“重新添加”以进行更新的架构更改。我将我的注释作为一个答案发布,以获得更好的代码格式,请参见下面的byte[]中的隐式转换运算符到处理赋值的Binary()。转换操作在参数为null的情况下引发异常。这实际上在操作员的文档中有所说明。请继续使用code.FYI的第一个版本——您可能应该编辑您的问题并将此信息添加到其中,而不是添加到单独的答案中。这将使您的问题对其他寻求相同问题解决方案的人更有用。
            if (from.ImageThumbnail != null) // works
            {
                to.ImageThumbnail = from.ImageThumbnail;
            }
            else
            {
                to.ImageThumbnail = null;
            }

            to.ImageThumbnail = from.ImageThumbnail != null ? from.ImageThumbnail : null; // fails

            to.ImageThumbnail = from.ImageThumbnail ?? null; // fails