2013-11-01 3 views
0

질문으로 파일 시스템에 이미지를 저장하고 데이터베이스에 링크를 저장하려고합니다. 하지만 NHibernate는 파일 경로를 데이터베이스에 저장하지 않습니다. 여기에 코드가 있습니다 :이미지를 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; 
    } 
+0

menuItemRepository.SaveOrUpdate의 코드는 무엇입니까? – MichaC

+0

@MichaC 코드가 추가되었습니다. 리포지토리는 모든 엔티티를 저장하거나 업데이트 할 수 있습니다. 또한 이미지를 db에 이진 파일로 저장할 수 있지만,이 상황을 위해 앱 디렉토리에 저장하는 것이 좋습니다. –

답변

0

MVC 애플리케이션 용 sessionPreRequest 모듈을 구현했습니다. 그래서 거기서 commit() 작업을하고있었습니다. 내 트랜잭션이 커밋되지 않고 롤백 중임을 확인했습니다. 오류를 확인하고 데이터베이스의 이미지 열이 nvarchar(50)이지만 이미지 경로가있는 문자열은 50 자 이상입니다. 그래서 nvarchar(200)으로 바뀌 었습니다. 이제 모든 것이 잘 작동합니다.

0

내 추측 - 저장은 데이터베이스에 플러시되지 않습니다. 참조 documentation : 때때로 메모리에 유지되는 객체들의 상태를 ADO.NET 연결의 상태를 동기화 시키는데 필요한 SQL 문장들을 실행시킬 것이다 ISession

. 이 과정 플러시, 나는 아무것도 볼 수 없습니다 ISession.Flush()

에서 NHibernate.ITransaction.Commit()

  • 에서 다음과 같은 점에서 기본적으로 Find() 또는 Enumerable()
  • 의 일부 호출에서

    • 발생하여 플러시를 트리거하는 코드 거래에 SaveOrUpdate 랩 :

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

      trx.Commit()가 데이터베이스에 보류중인 update 쿼리를 플래시합니다.

  • 관련 문제