2012-06-27 3 views
2

Я пытаюсь создать проект с ORM NHibernate, и в тот момент, когда я подумал, что все, что я закончил, дает мне NHibernate.MappingException: нет стойкая бактерия за исключением Я читал, что проблема может быть, что я не добавил сборку в конфигурационном файле, но я сделал это, а также не зафиксировано ...NHibernate.MappingException: Нет persister для: NHibernateExperiment.Player - я не могу найти решение

Если кто-то litle time, помогите мне, пожалуйста, исправить проблему.

здесь код, который я называю, чтобы добавить новый объект игрока

private void btnInsert_Click(object sender, EventArgs e) 
     { 
      Player playerData = new Player(); 
      SetPlayerInfo(playerData); 

      using (ISession session = SessionFactory.OpenSession) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        try 
        { 
         session.Save(playerData); // here it spits 
         transaction.Commit(); 
         GetPlayerInfo(); 
        } 
        catch (Exception ex) 
        { 
         transaction.Rollback(); 
         throw ex; 
        } 
       } 
      } 

     } 

private void GetPlayerInfo() 
     { 
      using (ISession session = SessionFactory.OpenSession) 
      { 
       IQuery query = session.CreateQuery("FROM Player"); 
       IList<Player> pInfos = query.List<Player>(); 
       dgvDisplay.DataSource = pInfos; 
      } 
     } 

private void SetPlayerInfo(Player playerData) 
     { 
      playerData.PlayerName = tbxName.Text; 
      playerData.PlayerAge = Convert.ToInt32(tbxAge.Text); 
      playerData.DOJ = Convert.ToDateTime(dtpDOJ.Text); 
      playerData.BelongsTo = cmbBelongsTo.SelectedItem.ToString(); 
     } 

здесь отображение Player.hbm.xml код

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true"> 
    <class name="NHibernateExperiment.Player, NHibernateExperiment" lazy="true"> 
    <id name="PlayerId"> 
     <generator class="native"/> 
    </id> 
    <property name="PlayerName" column ="PlayerName"/> 
    <property name="PlayerAge" column ="PlayerAge"/> 
    <property name="DOJ" column="DOJ"/> 
    <property name="BelongsTo" column="BelongsTo"/> 
    </class> 

</hibernate-mapping> 

вот App. config Код

<configuration> 
    <configSections> 
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> 
    </configSections> 
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
     <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 
     <property name="connection.connection_string">Server=GRITCAN;database=testDB;Integrated Security=SSPI;</property> 
     <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> 
     <property name="show_sql">true</property>   
     <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>   
    </session-factory> 
    </hibernate-configuration> 
</configuration> 

вот StackTrace

в NHibernateExperiment.Form1.btnInsert_Click (отправитель объекта, EventArgs е) в Е: \ Проекты \ Тесты \ NHibernate \ NHibernateExperiment \ NHibernateExperiment \ Form1.cs: строка 72 в системе. Windows.Forms.Control.OnClick (EventArgs e) в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) в System.Windows.Forms.Control .WmMouseUp (сообщение & m, кнопка мыши, кнопки Int32) в System.Windows.Forms.Control.WndProc (сообщение & m) at System.Windows.Forms.ButtonBase.WndProc (Message & м) на System.Windows.Forms.Button.WndProc (Сообщение & м) на System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Сообщение & м) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & м) на System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr HWND, Int32 сообщ, IntPtr WPARAM, IntPtr LPARAM) в System.Windows.Forms.UnsafeNativeMethods. DispatchMessageW (MSG & msg) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID, причина Int32, Int32 pvLoopData) в System.Windows.Forms.Applicat ion.ThreadContext.RunMessageLoopInner (Int32 причина, ApplicationContext контекст) в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32 причине, ApplicationContext контекст) в System.Windows.Forms.Application.Run (Форма MainForm) в NHibernateExperiment .Program.Main() в E: \ projects \ tests \ NHibernate \ NHibernateExperiment \ NHibernateExperiment \ Program.cs: строка 16 в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, String [] args) в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run (ИсполнениеКонтекстовое исполнениеКонтекст, ContextCallback callback , Состояние объекта, Bool ean ignoreSyncCtx) в System.Threading.ExecutionContext.Run (ИсполнениеКонтекстовое исполнениеКонтекст, Обратный вызов ContextCallback, Состояние объекта) в System.Threading.ThreadHelper.ThreadStart()

Я добавил следующие 2 ссылки на проект NHibernate.dll и NHibernate.ByteCode.LinFu.dll

Большое спасибо за вашу помощь!


Thank you BOYS. Build Action для .hbm.xml файл был Контент. Как вы мне предложили, я изменил его на Встраиваемый ресурс и все работает отлично :)

+1

Убедитесь, что изменить * Строить Действие * для '.hbm.xml' файла, * Embedded Resource *. –

+0

Спасибо. Файл ** Build Action ** для **. Hbm.xml ** был ** Содержание **. Я изменил его на ** Embedded Resource ** и все отлично работает :) – meorfi

ответ

2

Проверьте, помечено ли отображение xml как внедренный ресурс. Кроме того, я бы рекомендовал вам использовать библиотеку Fluent NHibernate - это свобода от написания огромного количества XML-отображений, только .net clasess

+0

Вам не нужно Свободно, чтобы заменить xml. Вы также можете использовать отображение по коду, функцию NH с версии 3.2. –

+0

Приятно знать - действительно крутая особенность. Извините, я не следую последним изменениям и все еще использую версию 1.X –

3

Вы сделали файл сопоставления встроенным ресурсом?

+0

Спасибо. Файл ** Build Action ** для **. Hbm.xml ** был ** Содержание **. Я изменил его на ** Embedded Resource ** и все работает отлично :) – meorfi

+1

этого недостаточно - проверьте этот файл. Создайте Action proferty. Он должен быть встроенным ресурсом –

0

работает Решение:

Form1.cs с использованием NHibernate; с использованием NHibernate.Cfg; с использованием системы; с использованием System.Collections.Generic; с использованием System.ComponentModel; с использованием System.Data; с использованием System.Drawing; с использованием System.Linq; с использованием System.Text; с использованием System.Threading.Tasks; с использованием System.Windows.Forms;

namespace NHibernateTutorialPart1 
{ 
    public partial class Form1 : Form 
    { 

     private Configuration myConfiguration; 
     private ISessionFactory mySessionFactory; 
     private ISession mySession; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      myConfiguration = new Configuration(); 
      myConfiguration.Configure("hibernate_mysql.cfg.xml"); 
      mySessionFactory = myConfiguration.BuildSessionFactory(); 
      mySession = mySessionFactory.OpenSession(); 

      using (mySession.BeginTransaction()) 
      { 
       Contact lbContact=new Contact{FirstName="Nisha", LastName="Shrestha",ID=0}; 
       mySession.Save(lbContact); 
       mySession.Transaction.Commit(); 
      } 
     } 
    } 
} 

**hibernate_mysql.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.MySQLDialect</property> 
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property> 
    <property name="connection.connection_string"> 
     User Id=root; 
     Server=localhost; 
     Password=Password1; 
     Database=nhibernatecontacts; 
    </property> 

    <!--This is good for Debugging but not otherwise--> 
    <property name="show_sql">true</property> 

    <!--<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>--> 
    <mapping assembly="NHibernateTutorialPart1"/> 
    </session-factory> 
</hibernate-configuration> 


**contact.hbm.xml** 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="NHibernateTutorialPart1" 
        namespace="NHibernateTutorialPart1"> 
    <class name="Contact" table="contact"> 
    <id name="ID" column="ID"> 
     <generator class="identity" /> 
    </id> 
    <property name="FirstName" /> 
    <property name="LastName" /> 
    </class> 
</hibernate-mapping> 

**Contact class** 


namespace NHibernateTutorialPart1 
{ 
    public class Contact 
    { 

     public virtual int ID { get; set; } 
     public virtual string FirstName { get; set; } 
     public virtual string LastName { get; set; } 

    } 
} 


**App.config** 

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/> 
    </configSections> 
</configuration> 

You need to add reference for lesi.collection and NHibernate 
You need to do embeded resource for contact.hbm.xml and hibernate_mysql.cfg.xml 

Я использовал MySQL Workbench, где я создал новую схему и новую таблицу с идентификатором, именем и фамилией.

Раствор для Нет стойкая бактерия для исключения был я забыл дал таблицу имя contact.hbm.xml

Смежные вопросы