NHibernate ICriteria возвращает null

Я пытаюсь создать wcf-службы, связанные с базой данных. Для подключения я использую NHibernate. Вот курс курса, который также отображается в файле rsultMngSystmMapper.hbm.xml:

[DataContract]
public class Course
{
 private int ccode;
 private string cname;
 private int credits;

 [DataMember]
 public int CCode
 {
 get
 {
 return ccode;
 }
 set
 {
 ccode = value;
 }
 }
 etc...
}

Каждое свойство (с геттером и сеттером) в вышеприведенном классе имеет атрибут DataMember. Теперь файл rsultMngSystmMapper.hbm.xml:

<!--?xml version="1.0" encoding="utf-8" ?-->
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="RManageSystemService" namespace="RManageSystemService.orm_rman_systm">
 <class name="Course" table="Courses" lazy="false">
 <id name="CCode" column="ccode">
 <generator>
 </generator></id>
 <property name="CName" column="cname">
 <property name="Credits" column="credit">
 </property></property></class>
</hibernate-mapping>

Теперь файл hibernate.cfg.xml:

<!--?xml version="1.0" encoding="utf-8" ?-->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
 <session-factory>
 <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
 <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
 <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
 <property name="connection.connection_string">Data Source=Mnemonics;User ID=Mnmncs;Password=mnmncs;Initial Catalog=database-name;Integrated Security=true</property>
 <property name="show_sql">true</property>
 <mapping assembly="RManageSystemService">
 </mapping></session-factory>
</hibernate-configuration>

Должен ли я помещать вышеуказанный код в web.config? Или это нормально, чтобы он разделился?

Теперь класс RMngrDataManipulation: Это единственный метод в этом классе:

public static Course RetrieveData(Course c)
{
 Configuration myConfig;
 ISessionFactory mySessFac;
 ISession mySess;
 myConfig = new Configuration();
 myConfig.Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "hibernate.cfg.xml"));
 mySessFac = myConfig.BuildSessionFactory();
 mySess = mySessFac.OpenSession();
 try
 {
 ICriteria criteria = mySess.CreateCriteria<course>();
 IList<course> cList = criteria.List<course>();
 foreach (Course course in cList)
 {
 c = course;
 }
 //This one is empty
 return c;
 }
 catch (Exception e)
 {
 throw;
 }
 finally
 {
 if (!mySessFac.IsClosed)
 {
 mySessFac.Close();
 }
 }
}
</course></course></course>

Результат, полученный при вызове метода RetrieveData() из класса CourseService.svc.cs в тестовом клиенте WCF, следующий

Я что-то пропустил? Правильно ли мой файл сопоставления? Я был бы очень благодарен за некоторые материалы от вас, ребята.

EDIT: глядя на вкладку вывода в VS2012, я нахожу это сообщение: первое исключение исключения типа "System.IO.DirectoryNotFoundException" произошло в mscorlib.dll

EDIT2 (27.12.2014, 17.51)

не удалось выполнить запрос [SELECT this_.ccode as ccode2_0_, this_.cname как cname2_0_, this_.credit as credit2_0_ FROM Курсы this_] [SQL: SELECT this_.ccode как ccode2_0_, this_.cname как cname2_0_, this_.credit as credit2_0_ FROM Курсы this_] Трассировка стека сервера: vid System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood (ответ сообщения, ошибка MessageFault, действие String, версия MessageVersion, ошибка faultConverter) vid System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc & rpc) vid System.ServiceModel.Channels.ServiceChannel.Call (действие String, Boolean oneway, операция ProxyOperationRuntime, Object [] ins, Object [] outs, тайм-аут TimeSpan) vid System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (метод IMethodCallMessageCall, ProxyOperationRuntime) vid System.ServiceModel.Channels.ServiceChannelProxy.Invoke (сообщение с сообщением) Исключение, указанное в [0]: vid System.Runtime.Remoting.Proxies.RealProxy.Handl eReturnMessage (IMessage reqMsg, IMessage retMsg) vid System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & msgData, тип Int32) vid IServiceManager.RetrieveData() vid ServiceManagerClient.RetrieveData()

1 ответ

Исходя из того, что это утверждение: foreach (Course course in cList) ничего не делает, т.е. cList empty - я подозреваю неправильный файл сопоставления. Что ж...

1) Можно подумать, что rsultMngSystmMapper.hbm.xml неправильно помечен как Embedded Resource. Проверьте свойства этого файла и его Build Action

2) Файл сопоставления находится в другой библиотеке, а затем в объектах POCO. В настройке указано: и потому, что POCO находится в этом случае, это может быть то, что ваши файлы сопоставления находятся в каком-то другом, например RManageSystemService.Data

Одним из этих "неправильных" настроек файла сопоставления может быть преступник.

NHibernate ведет себя немного странно, если мы попросим критерии для НЕ сопоставленного объекта/объекта. Он просто возвращает пустой список в конце, без каких-либо сообщений или исключений...

licensed under cc by-sa 3.0 with attribution.