2013-08-08 3 views
0

이것은 this question의 상세한 설명이다.NHibernate : 데이타베이스에있는 FK에 의해서만 관련이있는 커밋되지 않은 데이터로리스트를 채움

두 테이블이 있다고 가정하면 FooBar입니다.

Bar의 FK는 Foo입니다.

응용 프로그램에서 테이블은 클래스로 표시되며 Foo의 목록은 Bar입니다. Bar에는 데이터베이스에 FK가있는 Foo의 ID에 대한 속성이 있습니다. IsolationLevel.ReadUncommittedSessionTransaction의 맥락에서

, 나는 데이터베이스에 추가도 Bar의 인스턴스의 Foo_id 속성에 생성 된 ID를 지정하고, 데이터베이스에 Foo의 인스턴스를 추가합니다.

이제 Transaction.Commit()를 호출하기 전에, 그것은 NHibernate에 데이터베이스에서 Bar의 목록 Foo을 읽게 수 있습니까? 즉, 커밋되지 않은 데이터를 읽습니다.

나는 created a VS2012 project which demonstrates this입니다. 여기에는 필요한 데이터베이스를 구축하기위한 SSDT 프로젝트가 포함되어 있으며 내가 묻는 것을 보여주는 테스트가 있습니다.

감사합니다.

답변

0

동일한 트랜잭션의 컨텍스트에서 데이터베이스에 대한 모든 변경 사항을 읽을 수 있으므로 예. 해당 트랜잭션 내에서 이루어진 변경 사항에 대해서는 트랜잭션의 분리 레벨이 중요하지 않습니다.

그러나 NHibernate는 일반적으로 이미로드 된 객체를 업데이트하지 않습니다. 그러나 Flush(), Clear() 또는 Evict()를 차례로 수행 한 다음 Foo를 다시 읽으면 해당 모음에 Bar 인스턴스가 포함됩니다. 동일한 세션에있는 동안에는 Commit()이 자동으로 Flush()를 호출한다는 점을 제외하고는 트랜잭션을 커밋하는 것이 중요하지 않습니다.

+0

Flush(), Clear() 및 Evict(). – hlintrup

+0

Clear() 또는 Evict (foo) 후에 Foo를 다시 읽을 때 모음에 Bar 인스턴스가 포함됩니다. Flush() 자체는 효과가 없습니다. Clear()가 원하는 결과를 얻는 이유는 무엇입니까? 의사는 모든 인스턴스를 제거하고 보류중인 변경 사항을 취소한다고 말합니다. – hlintrup

+0

@hlintrup 그런 일이 일어나기 위해서는 NHibernate가 데이터베이스에 변경을 쓰는 이유를 발견했음을 의미합니다. Flush()는 수동 방법 일 뿐이므로 다른 시간에도 발생할 수 있습니다. –