2012-01-12 1 views
1

모델이 일시적 일 수있는 질의를 수행하는 오래된 코드를 가지고 있습니다. 즉, 사용자 입력에서 채워진 일부 필드가있는 모델이며이 필드는 쿼리의 일부로 사용됩니다. NH 2.1.x에서 작동했지만 최신 버전에서는 실패했습니다.Transient 인스턴스에 의한 NHibernate 질의는 "transient 인스턴스 저장"결과 -

예외는 "개체가 저장되지 않은 일시적인 인스턴스를 참조하며 플러시하기 전에 일시적인 인스턴스를 저장합니다"입니다. 이것은 NH가 비 지속 객체를 쿼리의 일부로 사용하여 쿼리를 수행하려고 할 때 발생합니다.

문제를 설명하기위한 단순화 된 버전입니다.

abstract class BaseModel 
    public virtual long Id { get; set; } 

class Car : BaseModel 
    public virtual Engine Engine { get;set; } 

class Engine : BaseModel 
    public virtual string Kind { get; set; } 


public static IList<Car> GetByEngine(Engine eng) { 
    ICriteria c = Session.CreateCriteria<Car>(); 
    c.Add(Expression.Eq("Engine", eng)); 
    return c.List<Car>(); // <--- Error occurs here 
} 

그리고 코드를 호출하면이 동일합니다 : 나는 (이전 NHibernate에 버전의 동작으로 표시되는) 일 것으로 예상 무엇

Engine obj = new Engine { Id = 42 }; // Transient instance 
    var x = GetByEngine(obj); 

, 전달되는 엔진 만 사용되는 것입니다 이드를 얻는다. 즉, select ....와 같은 SQl을 생성합니다. Cars where Engine = 42

그러나 새 버전에서는 NHibernate가 Expression에 사용 된 엔진이 실제로 유지되는지 확인하는 것처럼 보입니다.

쿼리를 수행하기 전에 지속 된 엔진을로드하지 않아도되는 방법이 있습니까?

답변

2

예 이미 세션에있는 경우 객체를 반환하거나 존재하지 않는 경우 lazyLoadingProxy를 반환하는 Session.Load()을 사용합니다.

public static IList<Car> GetByEngine(Engine eng) { 
    ICriteria c = Session.CreateCriteria<Car>(); 
    c.Add(Expression.Eq("Engine", Session.Load<Engine>(eng.Id))); 
    return c.List<Car>(); 
} 
+0

늦게 답장을 보내 주셔서 감사합니다. 이것은 트릭을 할 것이고, OP에서 나의 질문에 대답한다. 이 문제를 해결했습니다. – Thomas

1

이러한 종류의 시나리오에 사용할 수있는 방법은 Session.Load입니다.
Load 메서드는 엔터티에 Proxy을 반환하고 데이터베이스에 전혀 액세스하지 않을 Primary key 속성을 제외한 속성 중 하나에 액세스 할 때까지 데이터베이스에 도달하지 않습니다.

사용법 :

Engine obj = session.Load<Engine>(42); 
var x = GetByEngine(obj); 

체크 나는이 같은 것을 할 수 있다고 생각 this 기사

0

Session.Get에 대해과 Session.Load : 어쨌든

public static IList<Car> GetByEngine(Engine eng) { 
    ICriteria c = Session.CreateCriteria<Car>().CreateCriteria("Engine"); 
    c.Add(Expression.Eq("Id", eng.Id)); 
    return c.List<Car>(); 
} 

를 ...이 차있을 가능성이 방법 아직 저장하지 않았다면 그 엔진이 존재합니까?

+0

실제 응용 프로그램이 너무 복잡하여 여기에 게시 할 수 없으므로 예제가 고안되었습니다. 이것은 행동을 재현 한 최소 시나리오였습니다. – Thomas