尝试将 Binary 字段设置为 null 会给我一个 ArgumentNull 异常。我可以像这样将该字段设置为空,new Binary(new byte[] {});
但这不是空的,只是一个空列。是否有使用 LinqToSql 的解决方法?
4 回答
你还有别的事情发生。我刚刚创建了一个带有 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 文档指出在未来的版本中可能会发生一些变化。
您确定该字段在数据库中可以为空吗?linq 数据模型是否相应更新?如果使用基于属性的映射,则属性中应该有一个CanBeNull=true
设置[Column(...)]
。
@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
您可以使用ExecuteQuery()方法来传递您自己的 SQL。