Как указать EF byte[] в коде, сначала длиннее 8000 байт?

Я использую EF 6.1.3. Использование кода сначала устанавливает byte[] свойство в субъекте макс. 8000 байт. Любая попытка сделать его больше, то есть МАКС, не удалась.

HasMaxLength(null) (да, параметр int?) все еще устанавливает его на 8000, HasMaxLength(int.MaxValue) или любое другое значение больше 8000 заставляет EF бросить System.Data.Entity.Core.MetadataException:

Указанная схема недействительна. Ошибки: (0,0): ошибка 0026: MaxLength '2147483647' недопустимо. Длина должна быть от 1 до 8000 для типа varbinary.

Сервер SQL 13.0.2151 (mssqllocaldb) допускает использование varbinary(max):

Этот предел кажется мне слишком серьезным. Попытка найти причину, по которой она навязывается, также не дает для этого веских оснований. Итак, мой вопрос

Как byte[] может быть отображен в varbinary (max) в коде EF первым?

PS: свойство также 'обязательное', но я не уверен, что для необязательного свойства также может быть установлено значение varbinary(MAX). Во всяком случае, я не проверял этот случай, так как он не имеет особого смысла для меня.

4 ответа

Несмотря на множество статей, в которых говорится, что решение заключается в добавлении следующего атрибута

[Колонка (TypeName="изображение")]
byte [] Photo { get; get; задавать; }

Я нашел правильный подход, добавив вместо этого этот атрибут

[Максимальная длина]
открытый байт [] Photo { get; задавать; }

С рекомендацией Column(TypeName) я получу следующую ошибку с SQLCE:

Поле Photo должно иметь тип строки или массива с максимальной длиной 4000

Ну, я нашел обходной путь к этому. Определение HasColumnType("image") решает проблему, но я все еще думаю, что EF должен позволять указывать varbinary(max) также.

Более того, не все двоичные файлы являются изображениями.;)

И все же часть вопроса остается без ответа, поэтому я скажу так:

Почему свойство byte[] не может быть отображено в varbinary(max) в коде EF первым?

Любые комментарии (или ответы, конечно) приветствуются. Заранее спасибо.

РЕДАКТИРОВАТЬ (согласно комментарию Герта): оставляя свойство без каких-либо спецификаций, EF генерирует varbinary(max), Удивительно просто!

Возможно. Свободный API

      .IsMaxLength()

Прежде чем вы захотите обновить базу данных, взгляните на имя файла, которое создается после того, как вы используете "add-migration filename". Если вы видите метод "CreateTable" и видите, что поле должно быть двоичного типа с длиной MAX, его можно сгенерировать как c.Binary(maxLength: 8000), удалить параметр maxLength вообще, а затем использовать update-database, после чего вы можете проверить созданную таблицу в базе данных SQL-сервера!

Другие вопросы по тегам