Установите двоичное поле Linq To Sql равным null
-
22-09-2019 - |
Вопрос
Попытка присвоить двоичному полю значение null выдает мне исключение ArgumentNull .Я могу сделать поле пустым следующим образом new Binary(new byte[] {});
но это не null, а просто пустой столбец.Есть ли обходной путь с использованием LinqToSql ?
Решение
У тебя происходит что-то еще.Я только что создал небольшой образец таблицы с идентификатором (identity), обнуляемым 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 );
}
Возможно ли, что у вас есть частичная реализация класса, которая имеет обработчик SendPropertyChanging для свойства, вызывающего исключение ArgumentNullException?
Редактировать:основываясь на комментарии OP.
Обратите внимание, что вы не можете присвоить переменную типа byte[] двоичному файлу напрямую, поскольку это вызывает неявная операция преобразования и неявное преобразование вызовет исключение ArgumentNullException .Вы должны проверить, равно ли значение null, прежде чем пытаться присвоить его, и просто присвоить null, если переменная byte[] равна null.Мне это кажется странным поведением, и я хотел бы надеяться, что они изменят его в будущем.Документация MSDN указывает, что в будущих версиях могут произойти некоторые изменения.
Другие советы
Вы уверены, что это поле обнуляется в базе данных?Обновлена ли соответствующим образом модель данных linq?При использовании сопоставления на основе атрибутов должно быть CanBeNull=true
установка в [Column(...)]
атрибут.
@tvanfosson (опубликовано в качестве ответа для улучшения форматирования кода)
Да, вы правы, происходит что-то странное, что-то за пределами моих знаний C #.
От.ImageThumbnail - это байт[] 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.