2

同じ問題に関する 4 つのスタックオーバーフローの投稿を見ましたが、解決策が見つかりませんでした。

私の主なプログラム:

using System;
using System.IO;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Dialect;

namespace NhibernateORM
{
    public class Layout
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public double xCoordinate { get; set; }
        public double yCoordinate { get; set; }
    }
    class Program
    {
        private static int getDummyTableSize(ISession session)
        {
            ITransaction readTx = session.BeginTransaction();
            int size = session.CreateSQLQuery(@"select * from mydb.mytable").List<object>().Count;
            readTx.Rollback();
            return size;
        }

        static void Main(string[] args)
        {
            Configuration config = new Configuration();
            config.Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "hibernate.cfg.xml"));

            ISessionFactory factory = config.BuildSessionFactory();
            ISession session = factory.OpenSession();

            int countBefore = getDummyTableSize(session);

            ITransaction tx = session.BeginTransaction();
            Layout d = new Layout();
            d.Id = 213;
            d.Name = "hello";
            d.xCoordinate = 25.823;
            d.yCoordinate = 746.2;

            // POINT OF ERROR 
            session.Save(d);
            tx.Commit();

            if (countBefore + 1 == getDummyTableSize(session))
            {
                Console.WriteLine("woo hoo");
            }
            else
            {
                Console.WriteLine("oh no");
            }
            session.Close();
        }
    }
}

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="connection.driver_class">
      NHibernate.Driver.MySqlDataDriver
    </property>
    <property name="connection.connection_string">
      Server=localhost;Database=mydb;User="root";
    </property>
    <property name="dialect">
      NHibernate.Dialect.MySQL5Dialect
    </property>
    <!--<mapping assembly="NhibernateORM"/>-->
    <!-- mapping files -->
    <!--<mapping resource="Mapping.hbm.xml" />-->
  </session-factory>
</hibernate-configuration>

そして私のMapping.hbm.xmlファイル:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NhibernateORM" auto-import="true">
  <class name="Layout" table="mytable">
   <id name="Id" column="ID" type="int">
   </id> 
   <property name="Name" column="name" 
             type="String"></property>
  <property name="xCoordinate" column="xCoordinate" 
             type="double"></property>
<property name="yCoordinate" column="yCoordinate" 
             type="double"></property>
  </class>
</hibernate-mapping>

私は次のことを試しました:

  1. マッピング ファイル ( Mapping.hbm.xml) のビルド アクションを埋め込みリソースに設定し、構成ファイル ( hibernate.cfg.xml) のビルド アクションを埋め込みリソースとコンテンツに設定します。また、常にコピーするように出力ディレクトリへのコピーを設定します。

  2. hibernate-mapping タグの auto-import を true と false の両方に設定する

  3. にマッピング アセンブリ タグを追加しhibernate.cfg.xml、名前空間とアセンブリ名も確認しました。

  4. ファイルにマッピング リソース タグを追加するhibernate.cfg.xmlと、あいまいなマッピング タグのエラーが発生します。

さらに何を試すことができますか?session.save() 行の直前でエラーが発生し、session.save の上のテーブルの行数を取得するクエリは正常に機能します。

さらに、完全なエラー メッセージは次のとおりです。

NHibernate.MappingException was unhandled
  HResult=-2146232832
  Message=No persister for: NhibernateORM.Layout
  Source=NHibernate
  StackTrace:
       at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
       at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj)
       at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
       at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
       at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
       at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
       at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
       at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
       at NHibernate.Impl.SessionImpl.Save(Object obj)
       at NhibernateORM.Program.Main(String[] args) in d:\codebase\NhibernateORM\NhibernateORM\Program.cs:line 57
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
4

1 に答える 1

3

私が言いたいのは、そのすべての情報には、犯人がいるはずだということです。マッピングC# コードには非常に多くの問題(実際には問題があります)あり、次のことは確かです。

これMapping.hbm.xmlは正しく構成されていない、使用されていない、NHibernate では表示されない

このファイルをそのままNHibernate セッション ファクトリで使用できる場合、この例外が発生します。

System.TypeInitializationException: 'Instance' の型初期化子が例外をスローしました。---> NHibernate.MappingException: マッピング ドキュメントをコンパイルできませんでした: NhibernateORM.Mapping.hbm.xml ---> NHibernate.MappingException: 永続的なクラス レイアウト、NhibernateORM が見つかりません ---> System.TypeLoadException: タイプを読み込めませんでした'アセンブリ「NhibernateORM... からのレイアウト」

名前空間属性をマッピングに追加することで修正できますnamespace="NhibernateORM"

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
  assembly="NhibernateORM"
  namespace="NhibernateORM"
  auto-import="true">
  <class name="Layout" table="mytable">
    <id name="Id" column="ID" type="int" generator="assigned" />
    <property name="Name"        column="name"        type="String"/>
    <property name="xCoordinate" column="xCoordinate" type="double" />
    <property name="yCoordinate" column="yCoordinate" type="double" />
  </class>
</hibernate-mapping>

それが修正されると、後でこの例外が発生します

NHibernate.InvalidProxyTypeException: 次の型はプロキシとして使用できない場合があります: NhibernateORM.Layout: メソッドget_Idは 'public/protected virtual' または 'protected internal virtual' である必要があります...

これは、すべてのエンティティを仮想化することで修正できます。

namespace NhibernateORM
{
    public class Layout
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual double xCoordinate { get; set; }
        public virtual double yCoordinate { get; set; }

だから、確かに、私たちは知っています - 問題は

  • の間違った構成hibernate.cfg.xml
  • Mapping.hbm.xmlプロパティの構成が間違っている

これはhibernate.cfg.xmlの一部である必要があります。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
      ...
      <mapping assembly="NhibernateORM"/>

hibernate.cfg.xmlにはプロパティが必要です。

  • ビルド アクション === コンテンツ
  • 出力ディレクトリにコピー === 常にコピー

Mapping.hbm.xmlには次のプロパティが必要です。

  • ビルド アクション === 埋め込みリソース
  • 出力ディレクトリにコピー === コピーしない
于 2015-06-12T05:39:31.813 に答える