Как хранить изображения с помощью Entity Framework Code First CTP 5?
Я просто пытаюсь выяснить, есть ли простой способ хранения и извлечения двоичных (файловых) данных с помощью EF Code First CTP 5? Я бы очень хотел, чтобы он использовал тип FILESTREAM, но я действительно просто ищу способ заставить его работать.
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 может сделать это из коробки.