2011-01-11 21 views

Respuesta

37

No puede usar SQL FILESTREAM en EF. Se supone que EF debe funcionar sobre diferentes servidores de bases de datos, pero la característica filestream es una característica específica de SQL 2008 y posteriores. Puede intentar hacerlo a la antigua usanza: use varbinary(max) en su tabla de base de datos y use la matriz de bytes en su clase mapeada.

Editar:

pequeña aclaración - se puede utilizar FILESTREAM en la base de datos, pero EF no va a tomar ventaja de la transmisión. Lo cargará como estándar varbinary(max).

52

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

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

    public string Name { get; set; } 

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

Eso es más o menos. Si no mapea la propiedad, la convención se mapea a varbinary(max). Si usted tiene una columna de imagen en la base de datos ya sólo tiene que añadir [Column(TypeName = "image")] en la propiedad productImage o si lo prefiere asignación de código de agregar esto a su anulación OnModelCreating en la clase de contexto:

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

El problema que tengo con él es que No he encontrado una manera de hacer que la propiedad sea floja ya que no necesariamente quiero cargar datos binarios cada vez que obtengo un producto. No estoy seguro de recordar correctamente, pero NHibernate puede hacerlo de la caja.

+0

Sí, NHibernate puede hacer la columna específica perezoso de carga fuera de la caja: http://ayende.com/blog/4377/nhibernate-new-feature-lazy-properties. – gabe

95

siempre puedo crear otra clase como ProductImage con una asociación uno-a-uno con el fin de gestionar la carga diferida y también para normalizar la tabla:

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

Vi un gran aumento de rendimiento con esta técnica. – jsturtevant

+2

¿No sería mucho más simple crear una vista que no incluye la columna de imagen de archivo y luego crear una segunda entidad en EF que apunte a la vista en lugar de a la tabla, digamos, p. "ProductLite" –

+0

@ C.List No puedo creer que haya usado EF durante años y nunca pensé en hacer eso. Es una idea fabulosa y la utilicé para deshacerme de una visión innecesaria que estaba usando para hacer lo mismo. Vamos a llamarlo una "entidad virtual" :) –

Cuestiones relacionadas