4

尝试将 Binary 字段设置为 null 会给我一个 ArgumentNull 异常。我可以像这样将该字段设置为空,new Binary(new byte[] {});但这不是空的,只是一个空列。是否有使用 LinqToSql 的解决方法?

4

4 回答 4

5

你还有别的事情发生。我刚刚创建了一个带有 id(身份)、可为空的 varbinary(MAX)、不可为空的 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 的属性的 SendPropertyChanging 处理程序?

编辑:基于 OP 的评论。

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

于 2010-03-24T15:20:38.103 回答
1

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

于 2010-03-24T15:08:32.807 回答
1

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

是的,你是对的,发生了一些奇怪的事情,超出了我的 C# 知识。

from.ImageThumbnail 是 byte[] to.ImageThumbnail 是 Binary

使用 ?或者 ??运营商不会工作,如果我只使用 if else 它工作,很奇怪。我不明白为什么:-)

            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
于 2010-03-25T10:19:15.127 回答
0

您可以使用ExecuteQuery()方法来传递您自己的 SQL。

于 2010-03-24T15:08:11.360 回答