Установите для поля Linq To Sql Binary значение null - PullRequest
4 голосов
/ 24 марта 2010

Попытка установить двоичное поле в нуль дает мне исключение ArgumentNull. Я могу установить поле пустым, как это new Binary(new byte[] {});, но это не пустое поле, а пустой столбец. Есть ли обходной путь с использованием LinqToSql?

Ответы [ 4 ]

5 голосов
/ 24 марта 2010

У вас есть что-то еще происходит. Я только что создал небольшую примерную таблицу с идентификатором (identity), nullable varbinary (MAX), non-nullable 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?

РЕДАКТИРОВАТЬ : на основе комментария ОП.

Обратите внимание, что вы не можете назначить переменную типа byte [] двоичному файлу напрямую, поскольку это вызывает операцию неявного преобразования , и неявное преобразование вызовет ArgumentNullException. Вы должны проверить, является ли значение нулевым, прежде чем пытаться присвоить его, и просто присвоить нулевое значение, если переменная byte [] является нулевой. Мне это кажется странным поведением, и я надеюсь, что они изменят его в будущем. В документации MSDN указано, что в будущих версиях могут произойти некоторые изменения.

1 голос
/ 25 марта 2010

@ tvanfosson (опубликовано как ответ для лучшего форматирования кода)

Да, вы правы, что-то странное происходит, что-то за пределами моего знания C #.

from.ImageThumbnail является байтом [] to.ImageThumbnail is Binary

Использование? или же ?? операторы не будут работать, если я просто использую, если это еще работает, странно. Я не понимаю, почему: -)

            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
1 голос
/ 24 марта 2010

Вы уверены, что поле может быть пустым в базе данных? Обновляется ли модель данных linq соответственно? Если используется сопоставление на основе атрибутов, в атрибуте [Column(...)] должна быть настройка CanBeNull=true.

0 голосов
/ 24 марта 2010

Вы можете использовать метод ExecuteQuery () для передачи своего собственного SQL.

...