2

テスト用の不動産アプリが 1 つあります。パフォーマンスの問題があります。1 つのプロパティに 1 つ以上の画像を含めることができます。

これらの画像はバイナリとしてデータベースに保存されます。サーバー hdd 内に画像を保存し、db 内に参照パスを使用して、より良いソリューションを作成したいと考えています。

これを行う方法がわかりません。データベーステーブルをどのように設計すればよいですか? イメージをサーバーに保存し、そのパスをデータベースに保存するには? 現在のコードを掲載します。

言及する価値があるのは、画像を他のプロパティ情報と一緒にアップロードする必要があるということです (同じページで、参照ボタンを使用して)。

エンティティ

public class Property
{
   public Guid Id {get; set;}
   public string Name {get; set;}
   ...
   public List<Photo>Photos {get; set;}
}

public class Photo
{
   public Property Property {get; set;}
   public byte[] ImageData {get; set;}
   public string ImageMimeType {get; set;}
}

データベース設計

Photo table
    Id              int 
    ImageData       varbinary(MAX)  
    ImageMimeType   varchar(50) 
    Version         int 
    PropertyId      int 

投稿された画像などのデータをコントローラー内で処理する

 [HttpPost]
    public ActionResult Create(PropertyViewModel newData, IEnumerable<HttpPostedFileBase> images)
    {
        if (ModelState.IsValid)
        {
            using (ISession session = ...GetCurrentSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    Domain.Property model = new Domain.Property();
                    newData.ToDomainModel(model, images);
                    transaction.Commit();
                    session.Save(model);
                }
            }
            return RedirectToAction("Index");
        }
        else
        {
            return View(newData);
        }
    }

そして最後に ViewModel.ToDomain 内に投稿された画像をこのように保存します。

IEnumerable Images は Web フォームから投稿されることに注意してください

List<Photo> Photos = new List<Photo>();
            foreach (var image in Images)
            {
                if (image != null && image.ContentLength > 0)
                {
                    Photo p = new Photo();
                    p.Property = x;
                    p.ImageMimeType = image.ContentType;
                    p.ImageData = new byte[image.ContentLength];
                    image.InputStream.Read(p.ImageData, 0, image.ContentLength);

                    Photos.Add(p);
                }
            }
            x.Photos = new List<Photo>();
            x.Photos = Photos;

このアプローチは機能し、エンティティ間のマッピングは問題ありません。サーバー hdd に画像を保存し、db への参照を保存するには、何を変更する必要がありますか。

4

1 に答える 1

1

データを生ファイルとして db サーバー ディスクに保存することには、それ自体の問題があります。主な問題は、クライアント (この場合は Web サーバー) からファイル システムへのアクセスを構成する必要があることです。

Sql Server 2008 以降を使用している場合、中立的な立場があります: FILESTREAM

データはファイルに保存されますが、データベースからアクセスできます。したがって、データベース自体を肥大化させることなく、データベース接続を介して参照整合性とアクセスを取得できます。

于 2012-06-09T08:51:54.503 に答える