3

NHibernate ORMを使用してプロジェクトを作成しようとすると、完了したと思った瞬間にNHibernate.MappingExceptionが発生します。例外の永続化機能はありません。問題は、アセンブリを追加しなかったことが問題である可能性があることを読みました。設定ファイルにありますが、私はこれを行いました、そしてまたそれは修正されていません...

誰かが少し時間があれば、私が問題を解決するのを手伝ってください。

これが、新しいPlayerオブジェクトを追加するために呼び出すコードです。

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(Object sender、EventArgs e)in E:\ projects \ tests \ NHibernate \ NHibernateExperiment \ NHibernateExperiment \ Form1.cs:line 72 at System.Windows.Forms.Control.OnClick(EventArgs e)atSystem。 Windows.Forms.Button.OnClick(EventArgs e)at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)at System.Windows.Forms.Control.WmMouseUp(Message&m、MouseButtons button、Int32 clicks)atSystem.Windows。 Form.Windows.Forms.Button.WndProc(Message&m)at System.Windows.Forms.ButtonBase.WndProc(Message&m)at System.Windows.Forms.Button.WndProc(Message&m)at System.Windows.Forms.Control.ControlNativeWindow.OnMessage( Message&m)at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam)at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&msg)at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID、Int32 reason、Int32 pvLoopData)at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason、ApplicationContext context)at System.Windows.Forms.Application.Run(Form mainForm)のSystem.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason、ApplicationContext context) )at NHibernateExperiment.Program.Main()in E:\ projects \ tests \ NHibernate \ NHibernateExperiment \ NHibernateExperiment \ Program.cs:line 16 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly、String [] args)atSystem.AppDomain.ExecuteAssembly (文字列アセンブリファイル、エビデンスアセンブリセキュリティ、String [] args)at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()at System.Threading.ThreadHelper.ThreadStart_Context(Object state)at System.Threading.ExecutionContext.Run(ExecutionContext executeContext、ContextCallback callback、Object state、Boolean ignoreSyncCtx) System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext、ContextCallbackコールバック、オブジェクト状態)でSystem.Threading.ThreadHelper.ThreadStart()でオブジェクトの状態)System.Threading.ThreadHelper.ThreadStart()オブジェクトの状態)System.Threading.ThreadHelper.ThreadStart()

プロジェクト NHibernate.dllNHibernate.ByteCode.LinFu.dllに次の2つの参照を追加しました

あなたの助けをどうもありがとう!


ありがとうBOYS。.hbm.xmlファイルのビルドアクションContentでした。あなたが私に提案したように、私はそれを埋め込みリソースに変更しました、そしてすべてがうまくいきます:)

4

3 に答える 3

3

マッピングファイルを埋め込みリソースにしましたか?

于 2012-06-27T13:38:57.057 に答える
3

xmlマッピングが埋め込みリソースとしてマークされているかどうかを確認します。また、Fluent nHibernateライブラリを使用することをお勧めします-これは、大量のxmlマッピングを作成する必要がなく、.netクラスのみです。

于 2012-06-27T13:45:15.270 に答える
0

実用的な解決策:

NHibernateを使用するForm1.cs ; 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ワークベンチを使用して、ID、名、姓を使用して新しいスキーマと新しいテーブルを作成しました。

例外の永続性がない場合の解決策は、contact.hbm.xmlでテーブル名を指定するのを忘れたことです。

于 2014-01-24T16:55:10.610 に答える