Ошибка сохранения изображения в SQL CE 4.0 с ASP.NET MVC 3 и Entity Framework 4.1 с кодом в первую очередь - PullRequest
18 голосов
/ 21 апреля 2011

Я пытаюсь сохранить / сохранить изображение в базе данных 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 поддерживает эти типы данных .В этом сравнении между 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.

Редактировать:

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

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

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

Ответы [ 3 ]

18 голосов
/ 06 мая 2011

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

    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.

12 голосов
/ 18 июля 2012

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

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

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

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

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

3 голосов
/ 09 марта 2015

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

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

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