Як зберігати зображення за допомогою Entity Framework Code First CTP 5?


83

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

Відповіді:


41

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

Редагувати:

Невелике роз'яснення - ви можете використовувати FILESTREAMв базі даних, але EF не скористається перевагами потокового передавання. Це завантажить його стандартно varbinary(max).


112

Я завжди створюю інший клас, як ProductImageз асоціацією "один на один", щоб керувати ледачим завантаженням, а також нормалізувати таблицю:

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

4
Чи не було б набагато простіше створити подання, яке не включає стовпець зображення файлу, а потім створити другу сутність у EF, яка вказує на подання замість таблиці - скажімо, наприклад, "ProductLite"
C.List

@ C.List Я не можу повірити, що роками використовую EF і ніколи не думав цього робити. Це казкова ідея, і я просто застосував її до використання, позбувшись зайвого погляду, яким я користувався для того самого. Назвемо це "віртуальною сутністю" :)
Грег Гам

65

Просто оголосіть своє майно байтом [], як згадував Ладислав.

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 може це зробити нестандартно.


Так, NHibernate може виконувати ледаве завантаження для конкретного стовпчика з коробки: ayende.com/blog/4377/nhibernate-new-feature-lazy-properties .
gabe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.