2011-04-08 5 views
1

Hibernate에서 저장 프로 시저를 실행하여 원본 모델에없는 추가 필드를 반환 할 때 방법이 있습니까?NHibernate : 모델에없는 저장 프로 시저에서 추가 속성 반환

내가하고있는 일은 리소스 검색 결과를 반환하는 sproc을 만드는 것입니다. 그것은 내 Resource 클래스의 모든 일반 필드를 반환하지만 Rank라는 추가 필드도 반환합니다. 그걸 현재의 Resource 클래스에 매핑하는 방법이 있습니까 (아니면 Resource에서 상속 받고 그 하나의 속성 만 추가하는 클래스를 만들 수 있습니까?)?

내 SPROC의 실행은 다음과 같습니다

<sql-query name="GetRelatedResources"> 
    <return alias="item" class="ResourceRanked"> 
     <return-property column="Rank" name="Rank" /> 
     <return-property column="ResourceId" name="Id" /> 
     <return-property column="Name" name="Name" /> 
     <return-property column="Description" name="Description" /> 
     <return-property column="Filename" name="Filename" /> 
     <return-property column="Filetype" name="Filetype" /> 
     <return-property column="IsPublic" name="IsPublic" /> 
     <return-property column="IsFeatured" name="IsFeatured" /> 
     <return-property column="VideoEmbedCode" name="VideoEmbedCode" /> 
     <return-property column="VideoId" name="VideoId" /> 
     <return-property column="VideoPlayerId" name="VideoPlayerId" /> 
     <return-property column="VideoPlayerKey" name="VideoPlayerKey" /> 
     <return-property column="VideoHeight" name="VideoHeight" /> 
     <return-property column="VideoWidth" name="VideoWidth" /> 
     <return-property column="IsDeleted" name="IsDeleted" /> 
     <return-property column="CreatedOn" name="CreatedOn" /> 
     <return-property column="ModifiedOn" name="ModifiedOn" /> 
     <return-property column="CreatedBy" name="CreatedBy" /> 
     <return-property column="ModifiedBy" name="ModifiedBy" /> 
     <return-property column="CreatedByName" name="CreatedByName" /> 
     <return-property column="ModifiedByName" name="ModifiedByName" /> 
    </return> 
    exec dbo.gbi_sp_GetRelatedResources :pageSize, :pageIndex, :resourceId 
</sql-query> 

그리고 내 클래스 :

public class Resource : DomainEntity 
{ 
    [Required(ErrorMessage = "Please enter a name"), StringLength(100, ErrorMessage = "Name length can not exceed 100 characters")] 
    public virtual string Name { get; set; } 

    [StringLength(200, ErrorMessage = "Description length can not exceed 200 characters")] 
    public virtual string Description { get; set; } 

    public virtual string Filename { get; set; } 
    public virtual string Filetype { get; set; } 

    public virtual bool IsPublic { get; set; } 
    public virtual bool IsFeatured { get; set; } 

    [StringLength(500, ErrorMessage = "Embed Code length can not exceed 500 characters")] 
    public virtual string VideoEmbedCode { get; set; } 
    public virtual long? VideoId { get; set; } 
    public virtual long? VideoPlayerId { get; set; } 
    [StringLength(100, ErrorMessage = "Player Key length can not exceed 100 characters")] 
    public virtual string VideoPlayerKey { get; set; } 
    public virtual int? VideoHeight { get; set; } 
    public virtual int? VideoWidth { get; set; } 

    //public virtual int Rank { get; set; } 

    public virtual string Format { 
     get 
     { 
      if (ResourceFileType == ResourceFileType.EmbeddedVideo || ResourceFileType == ResourceFileType.VideoPlayer) 
       return "Video"; 

      switch (Filetype) 
      { 
       case "pdf": 
        return "Adobe Acrobat"; 
       case "docx": 
       case "doc": 
        return "Microsoft Word"; 
       case "ppt": 
       case "pptx": 
        return "Microsoft PowerPoint"; 
       case "xls": 
       case "xlsx": 
        return "Microsoft Excel"; 
       default: 
        return Filetype.ToUpper(); 
      } 
     } 
    } 

    public virtual ResourceFileType ResourceFileType 
    { 
     get 
     { 
      if (VideoId.HasValue) 
       return ResourceFileType.VideoPlayer; 
      if (!VideoEmbedCode.IsNullOrEmpty() || VideoId.HasValue) 
       return ResourceFileType.EmbeddedVideo; 
      return ResourceFileType.Document; 
     } 
    } 

    public virtual IEnumerable<Market> Markets { get; set; } 
    public virtual IEnumerable<Workstream> Workstreams { get; set; } 
    public virtual IEnumerable<Tag> Tags { get; set; } 
    public virtual IEnumerable<Topic> Topics { get; set; } 
    public virtual IEnumerable<ResourceType> Types { get; set; } 

    public override string ToString() 
    { 
     return Id + " - " + Name; 
    } 
} 

가 이상적으로 난 그냥

public class ResourceRanked : Resource 
{ 
    public virtual int Rank { get; set; } 
} 
자원을 확장하기 위해이 같은 클래스를하고 싶습니다

하지만 Resource 클래스의 xml 매핑을 복제하지 않으면 작동하지 않습니다. 내가 nhibernate에 대한 하위 클래스를 살펴 봤지만, 내가하려는 일에 적합하지 않은 것 같습니다.

답변

0

나에게 적합한 해결책을 찾지 못해 안타깝게도 저장된 proc의 반환 결과를 위해 다른 클래스를 구체적으로 매핑해야했습니다.

관련 문제