Entity Framework Code First CTP 5を使用して画像を保存する方法は?


回答:


41

FILESTREAMEFではSQLを使用できません。EFはさまざまなデータベースサーバー上で動作することになっていますが、ファイルストリーム機能はSQL2008以降の特定の機能です。古い方法でそれを試すことができvarbinary(max)ます-データベーステーブルで使用し、マップされたクラスでバイト配列を使用します。

編集:

明確化FILESTREAMはほとんどありません-データベースで使用できますが、EFはストリーミングを利用しません。標準でロードしますvarbinary(max)


112

ProductImage遅延読み込みを管理し、テーブルを正規化するために、常に1対1の関連付けのような別のクラスを作成します。

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

4
ファイルイメージ列を含まないビューを作成してから、テーブルの代わりにビューを指す2番目のエンティティをEFに作成する方がはるかに簡単ではないでしょうか。たとえば、「ProductLite」
C.List

@ C.List EFを何年も使用していて、そうすることを考えたことはありません。それは素晴らしいアイデアであり、私はそれを使用するだけで、同じことをするために使用していた不要なビューを取り除きました。それを「仮想エンティティ」と呼びましょう:)
Greg Gum

65

Ladislavが述べたように、プロパティを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オーバーライドに追加します。

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

私が抱えている問題は、製品をフェッチするたびにバイナリデータをロードする必要がないため、プロパティを遅延させる方法が見つからないことです。正しく思い出せるかどうかはわかりませんが、NHibernateは箱から出してそれを行うことができます。


はい、NHibernateは列固有の遅延読み込みをすぐに実行できます:ayende.com/blog/4377/nhibernate-new-feature-lazy-properties
gabe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.