Как хранить изображения с помощью Entity Framework Code First CTP 5? - PullRequest
78 голосов
/ 11 января 2011

Я просто пытаюсь выяснить, существует ли простой способ хранения и извлечения двоичных (файловых) данных с использованием EF Code First CTP 5? Мне бы очень хотелось, чтобы он использовал тип FILESTREAM, но я просто ищу способ заставить его работать.

Ответы [ 3 ]

107 голосов
/ 05 июня 2011

Я всегда создаю другой класс, например ProductImage, с однозначной ассоциацией для управления отложенной загрузкой, а также для нормализации таблицы:

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}
58 голосов
/ 16 января 2011

Просто объявите свою собственность как байт [], как упомянул Ладислав.

public class Product
{
    public int Id { get; private set; }

    public string Name { get; set; }

    public byte[] ProductImage { get; set; }
}

Вот и все.Если вы не сопоставляете свойство, соглашение заключается в varbinary(max).Если у вас уже есть столбец изображения в базе данных, просто добавьте [Column(TypeName = "image")] в свойстве ProductImage или если вы предпочитаете отображение кода, добавьте его в переопределение OnModelCreating в классе контекста:

modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");

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

42 голосов
/ 11 января 2011

Вы не можете использовать SQL FILESTREAM в EF. Предполагается, что EF работает поверх разных серверов баз данных, но особенность файлового потока - это особенность SQL 2008 и новее. Вы можете попытаться сделать это по-старому - используйте varbinary(max) в своей таблице базы данных и используйте байтовый массив в вашем отображенном классе.

Edit:

Небольшое уточнение - вы можете использовать FILESTREAM в базе данных, но EF не будет использовать потоковую передачу. Это загрузит это как стандарт varbinary(max).

...