2011-02-18 8 views
3

私はテーブルディスクに画像を保存し、EFでデータベースにリンクする方法は?

ID | ImagePath 
------------------- 
1 | ~/files/1.png 

を持って私のモデルクラスは、私は、ファイルに画像を保存するためのアプローチを見つけようとしています

public Int64 ID { ... } 
public string ImagePath { ... } 

を持っています。 byte[]プロパティを作成することを考えていて、SaveChangesを呼び出すとファイルを書き込むだけです。

可能ですか?この場合にのみ使用できる変更が保存されたときに発生するイベントはありますか?

pathをデータベースに、filesをディスクに保存する方が良いでしょうか?

+0

こんにちは、私は唯一のデータベースですべてを救いますdbとファイルシステムを混在させたアプローチではありません。これは、非常に多くの移植性とデータのバックアップを単純化します。例えば、別のマシンでのバックアップ/リストアだけでは、いくつかのフォルダからのスペアファイルの手動コピーなしでも十分です。 –

+0

@Davide、不可能です。このプロジェクトは、TBの画像に達する可能性があります。 (http://stackoverflow.com/q/3748/340760) – BrunoLM

+0

@Davideあなたが正しいです...そして、私は1つのフォルダに〜20k以上のイメージを格納することは、あなたのターゲットプラットフォーム上でパフォーマンスの問題が発生することを追加します。これを処理するには、イメージID用のハッシュされたフォルダ構造を作成する必要があります。 – Filburt

答えて

1

私のプロジェクトの1つでは、リンクされたエンティティ(リレーションは1対1)のために、フォルダ内のファイルとFilePathだけをデータベースに格納します。 私は、byte []プロパティを持つFileのエンティティを作成し、サーバー上のファイルを保存するドメインサービスを作成しました。 InsertFileでは、ディスク上のバイトを保存するファイルハンドラを呼び出します。

public IQueryable<WebFile> GetFiles() 
     { 

      string path = "~/Upload"; 

      List<WebFile> webFiles = new List<WebFile>(); 

      if (string.IsNullOrEmpty(path)) return webFiles.AsQueryable(); 

      DirectoryInfo di = new DirectoryInfo(HttpContext.Current.Server.MapPath(path)); 

      foreach (FileInfo file in di.GetFiles()) 
      { 

       webFiles.Add(new WebFile { FileName = file.Name }); 

      } 

      return webFiles.AsQueryable(); 

     } 

     public void InsertFile(WebFile file) 
     { 

      FileHandler.HandleFile(file); 

     } 

、データベース内のリンクは

のFileHandlerコード(1つのフォルダ、完全なパスを格納する理由があるので)ファイル名だけです:

public class FileHandler 
    { 
     public static void HandleFile(WebFile file) 
     { 

      string uploadDir = "~/Upload"; 

      if (!string.IsNullOrEmpty(uploadDir)) 
      { 

       if (uploadDir.IndexOf("~/") == 0) 

        uploadDir = HttpContext.Current.Server.MapPath(uploadDir); 

       if (uploadDir.LastIndexOf("/") == uploadDir.Length - 1) 

        uploadDir = uploadDir.Substring(0, uploadDir.Length - 1); 

       string fullFileName = string.Format("{0}/{1}", uploadDir, file.FileName); 

       if (File.Exists(fullFileName)) 
       { 

        string ext = fullFileName.Substring(fullFileName.LastIndexOf(".")); 

        string fName = fullFileName.Substring(0, fullFileName.LastIndexOf(".")); 

        fullFileName = string.Format("{0}_1{1}", fName, ext); 

       } 

       File.WriteAllBytes(fullFileName, file.FileContent); 

      } 

     } 
    } 
+0

'(uploadDir.EndsWith("/"))'が簡単ではないでしょうか? – Filburt

+0

かもしれないが、このコードは速くコード化され、いくつかの欠陥を含むことができる:)しかし、アイデアは表示されます –

+0

常に熟語の砂糖;-) – Filburt

関連する問題