¿Cómo almacenar imágenes usando Entity Framework Code First CTP 5?

83

Solo estoy tratando de averiguar si hay una manera simple de almacenar y recuperar datos binarios (archivos) usando EF Code First CTP 5. Realmente me gustaría que usara el tipo FILESTREAM, pero en realidad solo estoy buscando alguna manera de hacerlo funcionar.

Max Schmeling
fuente

Respuestas:

41

No puede usar SQL FILESTREAMen EF. Se supone que EF funciona sobre diferentes servidores de bases de datos, pero la función de flujo de archivos es una característica específica de SQL 2008 y versiones posteriores. Puede intentar hacerlo de la manera antigua: utilícelo varbinary(max)en la tabla de su base de datos y use la matriz de bytes en su clase asignada.

Editar:

Poca aclaración: puede usar FILESTREAMen la base de datos, pero EF no aprovechará la transmisión. Lo cargará de serie varbinary(max).

Ladislav Mrnka
fuente
112

Siempre creo otra clase como ProductImagecon una asociación uno a uno para administrar la carga diferida y también para normalizar la tabla:

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}
nima
fuente
4
¿No sería mucho más sencillo crear una vista que no incluye la columna de la imagen del archivo y luego crear una segunda entidad en EF que apunte a la vista en lugar de la tabla - digamos, por ejemplo, "ProductLite"
C.List
@ C.List No puedo creer que haya estado usando EF durante años y nunca pensé en hacer eso. Es una idea fabulosa y simplemente la puse en práctica, deshaciéndome de una vista innecesaria que estaba usando para hacer lo mismo. Llamémoslo una "entidad virtual" :)
Greg Gum
65

Simplemente declare su propiedad como byte [] como lo mencionó Ladislav.

public class Product
{
    public int Id { get; private set; }

    public string Name { get; set; }

    public byte[] ProductImage { get; set; }
}

Eso es básicamente todo. Si no asigna la propiedad, la convención es que se asigna a varbinary(max). Si ya tiene una columna de imagen en la base de datos, simplemente agregue [Column(TypeName = "image")]la propiedad ProductImage o si prefiere la asignación de código, agregue esto a su anulación de OnModelCreating en la clase de contexto:

modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");

El problema que tengo es que no he encontrado una forma de hacer que la propiedad sea perezosa, ya que no necesariamente quiero cargar datos binarios cada vez que obtengo un producto. No estoy seguro de recordarlo correctamente, pero NHibernate puede hacerlo de inmediato.

Cosmin Onea
fuente
Sí, NHibernate puede realizar la carga diferida específica de la columna desde el primer momento: ayende.com/blog/4377/nhibernate-new-feature-lazy-properties .
gabe