Тип данных для хранения документа в SQL Server 2008 через Entity Framework - PullRequest
1 голос
/ 11 ноября 2010

Я пытаюсь сохранить документ в SQL Server 2008 с использованием Entity Framework.

Мне кажется, у меня есть код для этого.Проблема, с которой я сейчас сталкиваюсь, заключается в том, какой тип данных использовать в SQL Server и в моей модели сущностей.

«Image» был моим первым выбором, но это вызывает ошибку «Недопустимое отображение» при обновлении модели.,Я вижу, что нет эквивалента «Image» (в раскрывающемся списке «Тип» в свойствах сущности).

Итак, я попробовал «varbinary (MAX)», и я вижу, что это соответствует «двоичному»в модели объекта.Однако, когда я запускаю код, он говорит мне, что данные будут усечены, поэтому он остановился.После исследования я вижу, что тип данных SQL Server «двоичный» имеет длину 8000 байт, поэтому я выбрал «varbinary (MAX)», поэтому модель сущностей, по-видимому, сводит / отображает «varbinary (MAX)» в «двоичный».

Правильно ли это?

Если да, какими должны быть мои типы данных (как в SQL Server 2008 , так и в моей модели сущностей), пожалуйста?Есть предложения?

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

В идеале не следует хранить документы в базе данных, вместо этого следует хранить путь к документу в базе данных, который затем указывает на физический документ на самом веб-сервере (или в каком-либо другом хранилище, CDN,и т. д.).

Однако, если вам необходимо сохранить его на SQL Server (и, как будто вы на SQL 2008), вы должны использовать FILESTREAM .

И это поддерживается EF4 (я верю).Он сопоставляется с бинарным .

Как я уже сказал, я не уверен, насколько хорошо это будет работать, запустите некоторые тесты - и если он не работает слишком хорошо, попробуйте использовать обычный ADO.NET / FileStream API.

Я все еще думаю, что вы должны поместить его в файловую систему, а не в базу данных (мое мнение, конечно)

1 голос
/ 12 ноября 2010

Измените тип данных вашей модели на byte [], и все будет хорошо, чувак, если вам нужны дополнительные объяснения, оставьте комментарий.

EDIT:

Чувак, я пробовал это раньше в Linq to Sql, и на этот раз я попробовал это в EF, в концептуальной модели вашего файла, а именно Foo.edmx, ваш тип - Binary (его можно открыть через контекстное меню Visual Studio. затем выберите Xml Editor или любой другой текстовый редактор, например блокнот), но в сгенерированном файле с именем Foo.designer.cs ваш тип данных - Byte [].

И нет предела, который вы упомянули выше. Я попробовал его с 10000 байтами, и он успешно вставлен без усечения моего массива. О бенчмарке при сохранении документов в базе данных или файловой системе я прочитал статью, в которой говорилось, что в Sql Server 7 файловая система имеет более высокую производительность при извлечении хранимых данных, но в более поздних версиях Sql Server она берет на себя скорость файловой системы и предложил сохранить документы на сервере Sql.

ИМХО при сохранении документов, если они не слишком велики, я предпочитаю хранить их в БД (насколько я знаю, у БД NoSql есть большая производительность),

Первое: целостность моих данных,

Второе: повышение производительности, которое вы можете получить (например, если в вашей папке большое количество файлов, чтение и запись файлов в этой папке постепенно замедляются все больше и больше, если вы не организуете их в более чем одну папку и предпочтительно в древовидную структуру, например папки),

В-третьих: Политики безопасности, которые вы можете применять к ним через свое приложение более легко (хотя вы можете сделать это на подходе файловой системы, но я думаю, что здесь легче)

Четвертый: вы можете воспользоваться возможностями, предоставляемыми вашей СУБД для запросов и манипулирования, и ... этими файлами

и многое другое ...: -)

...