2017-01-17 3 views
0

로 엔티티를 포장하지 않습니다 여기C#을 NHibernate에 나는 테이블이 프록시

CREATE TABLE [dbo].[GroupPhrases](
    [GroupId] [int] NOT NULL, 
    [PhraseId] [int] NOT NULL, 
    [Quality] [float] NOT NULL, 
    [VerdictsCount] [int] NOT NULL, 
    [IntersectionPercentage] [float] NULL, 
    [VerdictIds] [varbinary](max) NOT NULL, 
    [RelevanceResult] [varbinary](max) NOT NULL, 
CONSTRAINT [PK_GroupPhrases] PRIMARY KEY CLUSTERED 
(
    [GroupId] ASC, 
    [PhraseId] ASC 
) ON [PRIMARY] 

그리고 것은 테이블의 엔티티 :

public class GroupPhraseEntity 
{ 
    public virtual int GroupId { get; set; } 
    public virtual PhraseEntity Phrase { get; set; } 
    public virtual double Quality { get; set; } 
    public virtual int VerdictsCount { get; set; } 
    public virtual double? IntersectionPercentage { get; set; } 
    public virtual byte[] VerdictIds { get; set; } 
    public virtual byte[] RelevanceResult { get; set; } 

    public override bool Equals(object obj) 
    { 
     var castObj = obj as GroupPhraseEntity; 
     if (castObj == null) 
     { 
      return false; 
     } 
     return (GroupId == castObj.GroupId) && (Phrase.Id == castObj.Phrase.Id); 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 
} 

그리고 여기에 매핑 :

public class GroupPhraseEntityMap : ClassMapping<GroupPhraseEntity> 
{ 
    public GroupPhraseEntityMap() 
    { 
     Table("GroupPhrases"); 

     ComposedId(map => 
     { 
      map.Property(x => x.GroupId); 
      map.ManyToOne(x => x.Phrase, m => 
      { 
       m.Column("PhraseId"); 
      }); 
     }); 
     Property(x => x.Quality); 
     Property(x => x.IntersectionPercentage); 
     Property(x => x.VerdictsCount); 
     Property(x => x.VerdictIds, m => 
     { 
      m.Column("VerdictIds"); 
      m.Type(NHibernateUtil.BinaryBlob); 
      m.Length(Int32.MaxValue); 
      m.Lazy(true); 
     }); 
     Property(x => x.RelevanceResult, m => 
     { 
      m.Column("RelevanceResult"); 
      m.Type(NHibernateUtil.BinaryBlob); 
      m.Length(Int32.MaxValue); 
      m.Lazy(true); 
     }); 
    } 
} 

RelevanceResult 필드 값을 반환해야하는 메서드는 다음과 같습니다.

public RelevanceResult GetGroupRelevanceResult(int groupId, int phraseId) 
    { 
     using (var session = _sessionManager.GetSession()) 
     { 
      var groupPhrase = session.Query<GroupPhraseEntity>().FirstOrDefault(x => (x.GroupId == groupId) && (x.Phrase.Id == phraseId)); 
      if (groupPhrase == null) 
      { 
       return null; 
      } 
      return Deserialize<RelevanceResult>(groupPhrase.RelevanceResult); 
     } 
    } 

그러나 RelevanceResult 속성이로드되지 않았기 때문에 메서드가 실패합니다. 나는 그 쿼리가 나를 프록시 객체로 감싸지 않고 RelevanceResult 필드를 널로 유지하는 것을 보았다. 그 이유는 무엇입니까?

고맙습니다.

+0

null 또는 예외가 발생 했습니까? 생성 된 sql에 대해 살펴 보았습니까? – Rabban

+0

null이 반환되고 Deserialize 메서드에서 예외가 발생합니다. –

+0

생성 된 sql에 대해 살펴 보았습니까?이 경우 [NhProfiler] (https://www.hibernatingrhinos.com/products/nhprof)를 사용할 수 있습니다 – Rabban

답변

0

에서 출력하고자 할 필요가있다. 나는 테이블에 필드 ID를 추가 한 ComposedId를 제거했습니다. 문제가 해결되었지만 NHibernate의 버그처럼 보입니다.

0

RelevanceRankingResult은 게으른 속성입니다. _sessionManager.GetSession()IStatelessSession을 반환하는 경우, 당신은 명시 적으로 Select() 그것은 (그리고 다른 모든 열이 나는 문제가 매핑 ComposedId을 사용하여 것으로 나타났습니다 Deserialize()

+0

아니요, _sessionManager.GetSession()은 ISession을 반환합니다. 그래서 그것은 작동해야합니다 ...하지만하지 않습니다 ... –