Я просто пытаюсь выяснить, есть ли простой способ хранить и извлекать двоичные (файлы) данные, используя EF Code First CTP 5? Мне бы очень хотелось, чтобы он использовал тип FILESTREAM, но я действительно просто ищу способ сделать это.
Как хранить изображения с использованием кода Entity Framework First CTP 5?
Ответ 1
Вы не можете использовать SQL FILESTREAM
в EF. Предполагается, что EF работает на разных серверах баз данных, но функция фильтрации - особенность SQL 2008 и новее. Вы можете попробовать сделать это по-старому - используйте varbinary(max)
в своей таблице базы данных и используйте массив байтов в вашем сопоставленном классе.
Edit:
Небольшое пояснение - вы можете использовать FILESTREAM
в базе данных, но EF не будет использовать потоковое вещание. Он будет загружать его как стандартный varbinary(max)
.
Ответ 2
Я всегда создаю еще один класс типа ProductImage
с ассоциацией "один к одному" для управления ленивой загрузкой, а также для нормализации таблицы:
public class ProductImage
{
public int ProductId { get; private set; }
public byte[] Image { get; set; }
}
Ответ 3
Просто объявите свою собственность как 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 может сделать это из коробки.