2010-06-21 2 views
0

Fluent nHibernate에서 이상한 동작을 목격했습니다. 나는이 문제와 관련된 두 개의 객체, 즉 "Page"객체와 "Metadata"객체를 가지고있다. 페이지에 여러 메타 데이터 객체를 첨부 할 수 있으므로 매핑이 완료됩니다.Fluent nHibernate save null id - 고아 남기기

'in PageMap 
HasMany(Function(x) x.MetaData).Cascade.All() 
'in MetaDataMap 
References(Function(x) x.Page) 

저장 프로세스에서 문제가 발생합니다. 페이지 객체의 변경 사항을 저장하려면 기존 페이지 객체를 가져 와서 변경 사항 목록을 실행 한 다음 Session.Update (Page)를 사용하여 값을 저장하십시오. 이상한 행동은 데이터가 저장되지만 페이지 메타 데이터가 두 번 저장된다는 것입니다. 한 번 예상대로, 또 한 번은 page_id가 null입니다. 비록 낯선 것은 무엇입니까? 업데이트 명령을 주석 처리 할 때도 이런 일이 발생합니다. 실제로 데이터를 저장하는 업데이트가 아닙니다.

코드를 실행하고 데이터를 관찰하면서 nHibernate를 사용하여 페이지 개체의 세부 정보를 가져 오는 지점까지 오류를 추적했습니다. 따라서이 메서드를 호출하기 전에 데이터베이스에 Metdata 변경 사항이 전혀 표시되지 않습니다. 이후에는 DB (바쁠 것)가 표시되지 않지만 반환 된 페이지에는 추가 된 메타 데이터가 있습니다. get 메소드는 다음과 같습니다.

Public Function GetById(ByVal Id As Integer) As Cms.DataTransferObjects.Page Implements IPageManager.GetById 
    Dim session As ISession = NHibernateSessionManagerStore.Instance.GetSession() 
    Dim results As Cms.DataTransferObjects.Page 

    results = session.CreateCriteria(Of DataTransferObjects.Page)() _ 
     .Add(Expression.Like("Id", Id)) _ 
     .UniqueResult(Of DataTransferObjects.Page)() 

    Return results 
End Function 

데이터를 저장하는 것은 분명히 없습니다.

누구든지이 문제에 관해 밝힐 수 있습니까? 그것은 나를 광포하게 몰고있다!

환호, 매트

답변

1

인스턴스가 세션에 이미있는 경우 Update를 호출 할 필요가 없습니다. NHibernate는 객체에 대한 모든 변경을 찾아서 데이터베이스에 저장하기에 충분히 똑똑합니다. 인스턴스를 세션에 넣으려면 대개 쿼리를 사용하여 기존 객체를 가져 오거나 Save을 사용하여 새 인스턴스를 유지합니다. Update은 분리 된 인스턴스에만 유용합니다.

메모리 상태를 데이터베이스에 쓰는 것을 Flush ing이라고합니다. NH는 커밋하기 전에 플러시되지만 쿼리 전에도 실제 데이터에서 쿼리가 실행되도록합니다. 따라서 속성을 "A"로 설정하면이 속성을 "A"로 필터링하는 쿼리를 즉시 만들 수 있습니다. 당신의 인스턴스를 얻을 것이다).

NH이 null 외래 키를 저장하는 이유를 알지 못합니다. 어딘가에서 외래 키를 null로 설정하고 있습니까? 인스턴스를 다른 용도로 "재사용"하려고합니까?

+0

감사합니다. 매우 도움이되는 설명입니다. 그것이 나왔을 때 코드에서 다른 곳에 고아 개체를 생성하고 있었고 당장 DB에 커밋되지 않았기 때문에 혼란스러워했습니다. 나는 당신의 대답없이 이것을 발견했을 것입니다 의심 :) –