0

質問が意味するように、画像をファイルシステムに保存し、それへのリンクをデータベースに保存したいと考えています。しかし、NHibernate はファイル パスをデータベースに保存しません。コードは次のとおりです。

[HttpPost]
    public ActionResult Edit(Item item, HttpPostedFileBase image)
    {
        if (ModelState.IsValid)
        {
            if (image != null)
            {
                string imageName = image.FileName;
                string location = Path.Combine(Server.MapPath("~/Content/Images/ItemImages/") , imageName);
                image.SaveAs(location);
                item.Image= imageName;
            }

            menuItemRepository.SaveOrUpdate(item);
// here the debug show the image path has correctly assigned to the image property
                Debug.WriteLine(item.Image);
                TempData["message"] = string.Format("{0} has been saved", item.Name);
                return RedirectToAction("Index", item.Parent);
            }
            else
            {
                // there is something wrong with the data values 
                return View(Item);
            }
        }

しかし、リポジトリがアイテムを保存または更新した後、データベースを見ると、画像がnullです。イメージ名のようなものを割り当てようとしましたが、うまくいきましたが、イメージパスが機能していません!! なぜこれが起こるのか混乱しています。誰にもアイデアはありますか?

   public class Item
{
  public virtual string Image { get; set; } 
} 

public calss ItemMap : ClassMap<Item>
{
  public ItemMap()
{
Map(x => x.Image).Length(100);
}
}

//////////リポジトリ

 public T SaveOrUpdate(T entity)
    {
        session.SaveOrUpdate(entity);
        return entity;
    }
4

2 に答える 2

0

MVC アプリに sessionPreRequest モジュールを実装しました。そこで commit() 操作を行っていました。トランザクションがコミットされておらず、ロールバックしていることを確認しました。エラーを確認し、データベースの画像列は でしたnvarchar(50)が、画像のパスを持つ文字列は 50 文字を超えていました。だから私はに変更しnvarchar(200)、今ではすべて正常に動作します。

于 2013-11-03T13:43:02.050 に答える
0

私の最善の推測-保存はデータベースにフラッシュされていません。ドキュメントを参照してください:

ISessionは、ADO.NET 接続の状態をメモリに保持されているオブジェクトの状態と同期するために必要な SQL ステートメントを時々実行します。このプロセスflushは、デフォルトで次の時点で発生します

  • Find()orのいくつかの呼び出しからEnumerable()
  • からNHibernate.ITransaction.Commit()
  • からISession.Flush()

あなたのコードには、フラッシュをトリガーするものは何もありません。SaveOrUpdateトランザクションでラップします。

using (var trx = menuItemRepository.BeginTransaction())
{
    menuItemRepository.SaveOrUpdate(item);
    trx.Commit();
}

trx.Commit()その保留中updateのクエリをデータベースにフラッシュします。

于 2013-11-01T20:44:33.600 に答える