2011-01-11 7 views

答えて

37

EFでSQL FILESTREAMを使用することはできません。 EFは異なるデータベースサーバーの上で動作するはずですが、ファイルストリーム機能はSQL 2008以降の特定の機能です。あなたは古い方法でそれをやろうとすることができます - varbinary(max)データベーステーブルで使用し、マッピングされたクラスでバイト配列を使用します。

編集:

リトル明確化 - あなたは、データベース内のFILESTREAMを使用することができますが、EFは、ストリーミングを利用しません。それは標準varbinary(max)としてそれをロードします。

52

Ladislavが言及しているようにプロパティをbyte []として宣言するだけです。

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

    public string Name { get; set; } 

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

これはかなりです。プロパティをマップしない場合、コンベンションはvarbinary(max)にマップされます。 あなたは、データベース内の画像列を持っている場合は、すでにちょうどProductImageプロパティに[Column(TypeName = "image")]を追加したり、コードマッピングを好む場合、コンテキストクラスであなたのOnModelCreatingオーバーライドにこれを追加します。

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

私はそれを持っている問題は、ということです私は、製品をフェッチするたびにバイナリデータをロードする必要はないので、プロパティを怠惰にする方法は見つけられませんでした。 私は正しく思い出していませんが、NHibernateはそれを箱から出すことができます。

+0

はい、NHibernateのは、列固有の遅延ロードを行うことができますボックスの外:http://ayende.com/blog/4377/nhibernate-new-feature-lazy-properties。 – gabe

95

私はいつも遅延ロードを管理し、また、テーブルを正規化するために、1対1の関連でProductImageのような別のクラスを作成します。

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

このテクニックを使用して大幅にパフォーマンスが向上しました。 – jsturtevant

+2

ファイルイメージの列を含まないビューを作成し、テーブルの代わりにビューを指し示すEF内に2番目のエンティティを作成するほうがはるかに簡単ではないでしょうか? "ProductLite" –

+0

@ C.リスト何年もEFを使ってきたとは思ってもいません。それはすばらしいアイデアです。私はそれを使って、同じことをするために使っていた不要なビューを取り除きました。それを「仮想エンティティ」と呼ぶことにしましょう:) –

関連する問題