2010-02-25 3 views
0

Google에서 아무런 답변도 찾지 못한 채로 페이지를 넘기고 있지만 질문을 잘못 말하고있는 것 같습니다.런타임에 동적 조건을 기반으로하는 속성 매핑

시나리오는 다음과 같습니다. 사용자가 투표 할 수있는 엔티티가 있습니다. 인수를 위해 엔티티를 비즈니스로 호출 할 수 있습니다.

내 비즈니스 클래스에 현재 로그온 한 사용자가 특정 비즈니스에 투표 한 방법을 나타내는 속성을 갖고 싶습니다. 즉, 나는 사용자가 위를 향한 녹색 진드기와 사용자가 투표 한 적십자를 보여주고 싶다.

SQL의 경우 이것은 간단합니다. proc에 전달할 수있는 ": userid"매개 변수를 기반으로이 해결책을 수행하는 SQL 함수를 만들 수 있습니다. 즉

SELECT 
     BusinessId, 
     CreatedOn, 
     Username, 
     [Content].ResolveBusinessVoteIndicator(:userid, P.BusinessId) AS VoteIndicator 
    FROM 
     Content.Business P 

여기서 중요한 문제는 저장 프로 시저 결과에 매핑되는 엔티티를 만들어야한다는 것입니다. HQL이나 Criteria를 사용할 수 없기 때문에 어느 쪽이 좋을까요.

또 다른 옵션은 쿼리를 수행 한 다음 결과를 반복하고 해당 속성을 설정하는 것입니다. 한 번에 하나의 비즈니스 만보고있는 경우에는 작동하지만 하나의 큰 비즈니스 목록을 표시해야합니다. 시각.

그래서 내가 궁금한 것은 ... 런타임시 입력이 필요한 수식을 기반으로하는 HQL 또는 Criteria를 사용하여 속성을 매핑하는 방법이 있습니까? 저장 프로 시저에 매개 변수를 전달하고 결과를 매핑하는 것과 비슷합니다.

+0

NHibernate 수식과 예측을 살펴볼 것을 제안합니다. 나는 당신의 제안을 구현하는 약간의 시간을 보냈다 나는 다음과 같은 오류 얻을 SQL 방언 등의 사용자 정의 함수를 등록 후 –

답변

0

당신은이 상황에서 ViewModel에 대해 실제로 이야기하고 있습니다. 당신은 비즈니스 엔터티에 그 속성을 가져서는 안되지만, 당신이 말하는 플래그로 비즈니스 엔터티를 나타내는 뷰 모델을 생성해야한다.

NHibernate로 이것을 정말로하고 싶다면 데이터베이스에 뷰를 만들고 뷰 모델을 뷰에 맵핑하십시오. 다른 객체와 마찬가지로 HQL/Criteria를 실행할 수 있습니다. 나는 이것을 많이했고 잘 작동합니다.

또한 데이터 집합을 사용하여 저장된 proc에서 결과를 가져 와서 데이터 집합에 바인딩 할 수 있습니다. 귀하의 도메인 모델 (사업체)은 귀하의보기 모델 (투표 대상 비즈니스 클래스)과 동일하지 않으며 아마 동일한 데이터 액세스 코드에서 실행해서는 안됩니다.

그렉 영 (Greg Young)은 그의 블로그에서이 접근 방식에 대해 많이 이야기합니다. 예를 들면 다음과 같습니다. http://codebetter.com/blogs/gregyoung/archive/2010/02/15/cqrs-is-more-work-because-of-the-read-model.aspx

0

Derick의 대답은 각 비즈니스 요구 사항에 대한보기를 만들려는 경우에 적합합니다.

달성하고자하는 것은 IFilter으로 할 수 있습니다. Business 클래스

<property name="IsVoted" type="boolean" update="false" insert="false" formula="(SELECT [Content].ResolveBusinessVoteIndicator(:loggedOnUser.userId, BusinessId)"/> 

에와 ResolveBusinessVoteIndicator 저장 프로 시저 내부의 BusinessId 매개 변수는 비즈니스 테이블의 ID 열에 있어야한다는

public bool IsVoted {get;set;} 

참고 클래스 자체에 hbm.xml을 매핑 속성을 고려 그리고 NHibernate는 적절한 알리아스를 만들 것이다. 이제이 파일은 별도의 파일에 정의 할 수있는 다음 XML 요소에 따라 달라집니다 (filters.hbm을 말하십시오).XML)

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <filter-def name="loggedOnUser"> 
     <filter-param name="userId" type="Int32"/> 
    </filter-def> 
</hibernate-mapping> 

및 런타임에 당신은 당신의 쿼리를 실행하기 전에 프로그램

nhSession.EnableFilter("loggedOnUser").SetParameter("userId", GetLoggedOnUserId()); 

같은 필터를 사용. 또한, hql (pseudo-hql : '비즈니스 b에서 b.IsVoted = true'를 선택하여 투표 된 모든 비즈니스를 가져올 수 있습니다.)

+0

감사 재규어 : 매개 변수화 된 쿼리 '(4), @의 P1의 NVARCHAR (@의 P0의 NVARCHAR을 (4), @ p2 nvarchar (4000)) select top 1 '은 제공되지 않은 매개 변수'@ p2 '를 예상합니다. SQL 쿼리 분석기를 사용하여 쿼리를 SQL로 추적했으며 userId 필드가 대체 속성이 아니며 대신 EnableFilter 단계에서 설정된 사용자 이름 대신 SQL에 @ p2로 표시됩니다. 아이디어가 있으십니까? PS는 – Ross

+0

- = NSessionManager.Current.Session.CreateQuery을 VAR 쿼리를 다음과 같이 실제 질의는 (@ "BusinessEntry 에서 여기서 TopExperience.CreatedBy.Username는 = 추천 내림차순 의해 자명 순서") .SetString ("자명 ", username) .SetFirstResult (skip) .SetMaxResults (take); return query.List (). ToList(); – Ross

+0

뭔가 잘못되었습니다 .... 일반적으로 필터가 매개 변수를 전달하지 못하면 문자열 ': loggedOnUser.userId'가 쿼리에 남습니다. 그 외에, 나는 당신이 오류 메시지에 3 개의 매개 변수 (@ p0, @ p1, @ p2)를보고 있는데, 필터와 HQL 질의 자체로 2 개를 생성하고있다. 가져 오기를 만들기 위해 매핑, 클래스 (관련 부분 이상) 및 코드 예제를 게시 할 수 있습니까? – Jaguar

관련 문제