ayende.com/blog/4377/nhibernate-new-feature-lazy-properties

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

Ответы на вопрос(3)

как упомянул Ладислав.

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 может сделать это из коробки.

 gabe12 дек. 2013 г., 18:44
Да, NHibernate может выполнять специфичную для столбца ленивую загрузку из коробки:ayende.com/blog/4377/nhibernate-new-feature-lazy-properties.

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

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}
 C.List10 окт. 2015 г., 19:21
Разве не было бы намного проще создать представление, которое не включает столбец с изображением файла, а затем создать в EF вторую сущность, которая указывает на представление вместо таблицы - скажем, например, "ProductLite"
 jsturtevant18 авг. 2013 г., 13:45
Я видел значительное увеличение производительности при использовании этой техники.
 Greg Gum23 нояб. 2015 г., 00:10
@ C.List Я не могу поверить, что я использовал EF в течение многих лет и никогда не думал об этом. Это невероятная идея, и я просто применил ее, чтобы избавиться от ненужного представления, которое я использовал, чтобы сделать то же самое. Давайте назовем это «виртуальной сущностью» :)
Решение Вопроса

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

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

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

Ваш ответ на вопрос