Я просто пытаюсь выяснить, есть ли простой способ хранить и извлекать двоичные (файловые) данные с помощью EF Code First CTP 5? Мне бы очень хотелось, чтобы он использовал тип FILESTREAM, но на самом деле я просто ищу способ заставить его работать.
Я просто пытаюсь выяснить, есть ли простой способ хранить и извлекать двоичные (файловые) данные с помощью EF Code First CTP 5? Мне бы очень хотелось, чтобы он использовал тип FILESTREAM, но на самом деле я просто ищу способ заставить его работать.
Ответы:
Вы не можете использовать SQL FILESTREAM
в EF. Предполагается, что EF работает поверх разных серверов баз данных, но функция потока файлов - это особенность SQL 2008 и новее. Вы можете попробовать сделать это по-старому - использовать varbinary(max)
в таблице базы данных и использовать массив байтов в сопоставленном классе.
Редактировать:
Небольшое уточнение - вы можете использовать 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 в классе контекста:
modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");
Проблема, с которой я столкнулся, заключается в том, что я не нашел способа сделать свойство ленивым, поскольку мне не обязательно загружать двоичные данные каждый раз, когда я получаю продукт. Я не уверен, что правильно помню, но NHibernate может сделать это из коробки.