linq2sql проблемы с сохранением изображений - PullRequest
4 голосов
/ 22 декабря 2009

У меня есть объект со свойством:

[Column]
public Binary Image { get; set; }

Когда объект сохраняется в первый раз, все это нормально, но когда он изменяется, я получаю исключение на SubmitChanges:

Типы данных изображения и varbinary (max) несовместимы в равно оператору.

В чем здесь проблема?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

Вы получаете "" исключение? Проблема в том, что linq2sql хочет проверить, чтобы убедиться, что он должен изменить столбец, прежде чем он действительно изменит его. Мне обычно это безразлично, и я совершенно счастлив обновить всю строку, поэтому я добавил в свой ColumnAttributes именованный параметр UpdateCheck = UpdateCheck.Never. Т.е.

[Column(UpdateCheck = UpdateCheck.Never)]

Затем, когда я хочу сохранить элемент, я просто делаю это:

Table<TEntity> da = MyDataContext.Context.GetTable<TEntity>();

if (entity.Id > 0)
    da.Attach(entity, true);

else
    da.InsertOnSubmit(entity);

da.Context.SubmitChanges();
0 голосов
/ 22 декабря 2009

Просто отступите на секунду - как вы сравниваете эти переменные?

Вы вычисляете хеш для изображений? Сравнение хэшей намного лучше, чем сравнение изображений байт за байтом.

0 голосов
/ 22 декабря 2009

Я думаю, что вы можете работать по умолчанию Оптимистичный параллелизм в LINQ to SQL (и я считаю, что LINQ to Entities работает аналогично).

Если не указано иное, непосредственно перед обновлением строки он выполняет инструкцию SELECT для предыдущих значений всех столбцов в строке, чтобы посмотреть, изменил ли кто-нибудь их, пока вы сохранили их в памяти.

Однако, похоже, он не знает, как сравнивать два двоичных экземпляра.

Если это так, у вас есть два варианта:

  • Используйте более явную версию Optimistic Concurrency, указав версию строки на основе назначенной строки метки времени ( предпочтительно )
  • Отключить оптимистический параллелизм

Вот документация для оптимистического параллелизма для LINQ to SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...