EF Code First CTP 5を使用してバイナリ(ファイル)データを保存および取得する簡単な方法があるかどうかを調べようとしていますか?FILESTREAMタイプを使用したいのですが、実際に機能させる方法を探しています。
EF Code First CTP 5を使用してバイナリ(ファイル)データを保存および取得する簡単な方法があるかどうかを調べようとしていますか?FILESTREAMタイプを使用したいのですが、実際に機能させる方法を探しています。
回答:
FILESTREAM
EFではSQLを使用できません。EFはさまざまなデータベースサーバー上で動作することになっていますが、ファイルストリーム機能はSQL2008以降の特定の機能です。古い方法でそれを試すことができvarbinary(max)
ます-データベーステーブルで使用し、マップされたクラスでバイト配列を使用します。
編集:
明確化FILESTREAM
はほとんどありません-データベースで使用できますが、EFはストリーミングを利用しません。標準でロードしますvarbinary(max)
。
ProductImage
遅延読み込みを管理し、テーブルを正規化するために、常に1対1の関連付けのような別のクラスを作成します。
public class ProductImage
{
public int ProductId { get; private set; }
public byte[] Image { get; set; }
}
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は箱から出してそれを行うことができます。