83 votes

Comment stocker des images en utilisant Entity Framework Code First CTP 5 ?

J'essaie de savoir s'il existe un moyen simple de stocker et d'extraire des données binaires (fichiers) avec EF Code First CTP 5 ? J'aimerais vraiment qu'il utilise le type FILESTREAM, mais je cherche simplement un moyen de le faire fonctionner.

111voto

nima Points 418

Je crée toujours une autre classe comme ProductImage avec une association biunivoque afin de gérer le chargement paresseux et aussi de normaliser la table :

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

62voto

Cosmin Onea Points 1616

Il suffit de déclarer votre propriété comme byte[] comme Ladislav l'a mentionné.

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

    public string Name { get; set; }

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

C'est à peu près tout. Si vous ne mappez pas la propriété, la convention veut qu'elle soit mappée à un fichier varbinary(max) . Si vous avez déjà une colonne image dans la base de données, ajoutez simplement [Column(TypeName = "image")] sur la propriété ProductImage ou, si vous préférez le mappage de code, ajoutez-le à votre surcharge OnModelCreating dans la classe de contexte :

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

Le problème que j'ai est que je n'ai pas trouvé le moyen de rendre la propriété paresseuse car je ne veux pas nécessairement charger des données binaires à chaque fois que je vais chercher un produit. Je ne suis pas sûr de me souvenir correctement, mais NHibernate peut le faire d'emblée.

42voto

Ladislav Mrnka Points 218632

Vous ne pouvez pas utiliser SQL FILESTREAM dans EF. EF est censé fonctionner sur différents serveurs de bases de données, mais la fonctionnalité de filtrage est une fonctionnalité spécifique de SQL 2008 et des versions plus récentes. Vous pouvez essayer de le faire à l'ancienne - utiliser varbinary(max) dans votre table de base de données et utiliser le tableau d'octets dans votre classe mappée.

Edit :

Petite précision - vous pouvez utiliser FILESTREAM dans la base de données, mais EF ne tirera pas parti du streaming. Il le chargera de manière standard varbinary(max) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X