Подтвердить что ты не робот

Ошибка хранения изображения в SQL CE 4.0 с помощью ASP.NET MVC 3 и Entity Framework 4.1. Код сначала

Я пытаюсь сохранить/сохранить изображение в базе данных SQL Compact Edition (CE).

Я объявляю это поле в моей модели Student следующим образом:

[Column(TypeName = "image")]
public byte[] Photo { get; set; }

База данных создается с типом данных изображения для столбца Фото, как показано здесь:

enter image description here

Проблема заключается в следующем:

Когда я запускаю приложение и пытаюсь сохранить Студент с фотографией 3 МБ (например), я получаю исключение:

validationError.ErrorMessage = "The field Photo must be a string or array type
with a maximum length of '4000'."

SQL Server CE поддерживает эти Типы данных. В этом comparison между SQL Express и SQL Compact Edition (CE) мы имеем, что SQL CE поддерживает двоичное (BLOB) хранилище с использованием изображения тип данных.

Изображение= двоичные данные переменной длины с максимальной длиной 2 ^ 30-1 (1 073 741 823) байт. Хранение - это длина значения в байтах.

Изображение должно выполнять работу, я думаю.

Что я здесь делаю неправильно? Это ошибка?

Примечание:

Я также пробовал аннотацию данных MaxLength:

[Column(TypeName = "image")]
[MaxLength(int.MaxValue)]
public byte[] Photo { get; set; } 

но я получаю это исключение:

Binary column with MaxLength greater than 8000 is not supported.

Edit:

Я нашел сообщение о выпуске EF 4.1. Он имеет следующее:

Изменение длины по умолчанию для не-ключа строковые и двоичные столбцы из '128 до 'Макс. SQL Compact не поддерживает Максимальные столбцы при работе против SQL Compact дополнительный код сначала соглашение будет устанавливать длину по умолчанию из 4000. Более подробная информация о изменение, внесенное в недавний блог post (ниже).

Хорошо, хорошо... единственный способ заставить его работать - это сделать то, что описано здесь, то есть установить DbContext.Configuration.ValidateOnSaveEnabled = false, Это обходное решение, как предполагает сообщение.

4b9b3361

Ответ 1

Для тех, кто испытывает эту проблему, Эрик Эйлсков Дженсен опубликовал приложение рабочей консоли, которое демонстрирует обходной путь этой ошибки. Как отметил ОП, ключевой частью ответа является:

    public StudentContext()
    {
        // Required to prevent bug - http://stackoverflow.com/questions/5737733
        this.Configuration.ValidateOnSaveEnabled = false;        
    }

Было найдено лучшее решение. Не отключайте проверку. [Обновления из сообщения блога] UPDATE: @DamienGuard, of LINQ to SQL and EF Code First fame, pointed out that a better and more provider agnostic solution is to use MaxLength rather than TypeName = "ntext".

UPDATE 2: Using [MaxLength] prevents any validation errors, and disabling validation is not required.

Ответ 2

Способ указания максимальной длины с использованием аннотации данных MaxLength не должен содержать максимального значения. Например:

[MaxLength]
public byte[] Photo { get; set; }

Поставщик SQL Compact затем сопоставляет свойство с "изображением", а проверка EF распознает, что максимальной длины нет и поэтому ее не нужно отключать. Если вы хотите явно указывать на сопоставление с столбцом "изображение", вы можете сделать это:

[Column(TypeName = "image")]
[MaxLength]
public byte[] Photo { get; set; }

который даст тот же результат при использовании SQL Compact.

Ответ 3

Я знаю, что это слишком поздно, но это может принести пользу другим программистам.

Вы можете добавить к классу контекста внутри метода OnModelCreating (DbModelBuilder modelBuilder)

 modelBuilder.Entity<EntityName>().Property(p => p.Photo).IsMaxLength();