Как хранить изображения с помощью Entity Framework Code First CTP 5?


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

3 72

3 ответа:

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

Edit:

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

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

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}

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

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 в классе context:

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

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