2009-11-26 3 views
0

У меня есть следующее имя Queryé, результат которого мне нравится сопоставлять с классом.NHibernate Fluent и named Queries

<sql-query name="GetIndustryCodes"> 
    <return class="IndustryCode"> 
     <return-property name="Sector_kategorie" column="Sector_kategorie"/> 
     <return-property name="Sector_scheme_reference" column="Sector_scheme_reference"/> 
     <return-property name="Group_Beschreibung" column="Group_Beschreibung"/>  
    </return>   
    <![CDATA[ 
     select * from 
    (
     select  
    lvl1.sprach_iso_cd, 
     lvl1.kategorie Sector_kategorie, 
     lvl1.scheme_reference Sector_scheme_reference, 
     lvl1.Beschreibung Sector_Beschreibung, 

     lvl2.kategorie Group_kategorie, 
     lvl2.scheme_reference Group_scheme_reference, 
     lvl2.Beschreibung Group_Beschreibung, 

     lvl3.kategorie Industry_kategorie, 
     lvl3.scheme_reference Industry_scheme_reference, 
     lvl3.Beschreibung Industry_Beschreibung, 

     lvl4.kategorie Subindustry_kategorie , 
     lvl4.scheme_reference Subindustry_scheme_reference, 
     lvl4.Beschreibung Subindustry_Beschreibung 

     from StagingDb.Rds.GR3_S_R10916_TX lvl1 

     left join StagingDb.Rds.GR3_S_R10916_TX lvl2 
     on lvl2.sprach_iso_cd = lvl1.sprach_iso_cd 
     and lvl2.kategorie = 'MSCIS&PGroup' 
     and lvl1.scheme_reference = substring(lvl2.scheme_reference,1,2) 

     left join StagingDb.Rds.GR3_S_R10916_TX lvl3 
     on lvl3.sprach_iso_cd = lvl1.sprach_iso_cd 
     and lvl3.kategorie = 'MSCIS&PIndustry' 
     and lvl2.scheme_reference = substring(lvl3.scheme_reference,1,4) 

     left join StagingDb.Rds.GR3_S_R10916_TX lvl4 
     on lvl4.sprach_iso_cd = lvl1.sprach_iso_cd 
     and lvl4.kategorie = 'MSCIS&P' 
     and lvl3.scheme_reference = substring(lvl4.scheme_reference,1,6) 

     where lvl1.kategorie = 'MSCIS&PSector' 

) t 
    where t.sprach_iso_cd ='en' 
    ]]> 
    </sql-query> 

Также у меня есть C# класс

public class IndustryCode 
    { 
     public virtual string Sector_kategorie { get; set; } 
     public virtual string Sector_scheme_reference { get; set; } 
     public virtual string Sector_Beschreibung { get; set; } 
     public virtual string Group_kategorie { get; set; } 
     public virtual string Group_scheme_reference { get; set; } 
     public virtual string Group_Beschreibung { get; set; } 
     public virtual string Industry_kategorie { get; set; } 
     public virtual string Industry_scheme_reference { get; set; } 
     public virtual string Industry_Beschreibung { get; set; } 
     public virtual string Subindustry_kategorie { get; set; } 
     public virtual string Subindustry_scheme_reference { get; set; } 
     public virtual string Subindustry_Beschreibung { get; set; }   

    } 

Теперь в то время как запуск программы я получаю exceptioné неверный или неполный конфигурации был использован при создании SessionFactory. Для получения более подробной информации просмотрите коллекцию PotentialReasons и InnerException.

InnerExceptioné «Указанный ключ отсутствует в словаре».

Если я использую Query без класса return, то он работает хорошо, за исключением того, что я получаю возвращаемое значение, не отображаемое в класс. Но класс определенно находится в сборке. Как я могу сопоставить запрос в классе?

Большое спасибо

ответ

0

После некоторого взлома я уверен, что я могу только отобразить вывод некоторой SP к классу, который имеет отображение в БД.

Так что просто наличие sp и отображение его на какой-то класс не сработает. класс должен иметь Mapping, поэтому класс должен быть классом модели домена.

0

У меня нет сопоставления классов в БД. Ниже код работал для меня. Где Desk определен в файле Desk.hbm.xml.

public class NHibernateHelper 
{ 
    private readonly string _connectionString; 
    private ISessionFactory _sessionFactory; 

    public NHibernateHelper(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public ISessionFactory SessionFactory 
    { 
     get { return _sessionFactory ?? (_sessionFactory = CreateSessionFactory()); } 
    } 

    private ISessionFactory CreateSessionFactory() 
    { 
     return Fluently.Configure() 
       .Database(MsSqlConfiguration.MsSql2008.ConnectionString(_connectionString)) 
       .Mappings(m => m.FluentMappings.AddFromAssemblyOf<NHibernateHelper>()) 
       .Mappings(m => m.HbmMappings.AddClasses(typeof(Desk))) 
       .BuildSessionFactory(); 
    } 
}