【发布时间】:2010-03-24 15:04:36
【问题描述】:
尝试将 Binary 字段设置为 null 会给我一个 ArgumentNull 异常。
我可以像这样new Binary(new byte[] {}); 将字段设置为空,但这不是空的,只是一个空列。有没有使用 LinqToSql 的解决方法?
【问题讨论】:
标签: c# linq-to-sql varbinary
尝试将 Binary 字段设置为 null 会给我一个 ArgumentNull 异常。
我可以像这样new Binary(new byte[] {}); 将字段设置为空,但这不是空的,只是一个空列。有没有使用 LinqToSql 的解决方法?
【问题讨论】:
标签: c# linq-to-sql varbinary
你还有其他事情发生。我刚刚创建了一个带有 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,因为这会调用 implicit conversion operation,并且隐式转换将引发 ArgumentNullException。您应该在尝试分配它之前检查该值是否为 null,如果 byte[] 变量为 null,则只需分配 null。对我来说,这似乎是一种奇怪的行为,我希望他们将来会改变它。 MSDN 文档指出未来版本可能会发生一些变化。
【讨论】:
您确定该字段在数据库中可以为空吗? linq 数据模型是否相应更新?如果使用基于属性的映射,[Column(...)] 属性中应该有一个CanBeNull=true 设置。
【讨论】:
@tvanfosson(发布为获得更好的代码格式的答案)
是的,你是对的,发生了一些奇怪的事情,超出了我的 C# 知识范围。
from.ImageThumbnail 是 byte[] to.ImageThumbnail 是二进制的
使用 ?或者 ??运营商不会工作,如果我只使用 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
【讨论】:
您可以使用ExecuteQuery() 方法来传递您自己的SQL。
【讨论】: