5

NHibernateの学習を始めようとしていますが、非常に単純なPOCOでテストしているときに、すでに問題が発生しています。NoPersister例外が発生します。コードは次のようになります。

Accountテーブル:

create table Account
(
    AccountID int primary key identity(1,1),
    AccountName varchar(10),
    CreateDate datetime
)
go

Accountクラス:

public class Account
{
    public virtual int AccountID { get; set; }
    public virtual string AccountName { get; set; }
    public virtual DateTime CreateDate { get; set; }

    public Account()
    {
        AccountID = 0;
        AccountName = "";
        CreateDate = new DateTime();
    }
}

マッピングファイルAccount.hbm.xml(はい、アセンブリに埋め込まれています):

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="NHibernateTesting" assembly="NHibernateTesting">
  <class name="Account" table="Account">
    <id name="AccountID">
      <generator class="native"/>
    </id>
    <property name="AccountName" />
    <property name="CreateDate" />
  </class>
</hibernate-mapping>

構成ファイルの構成セクション:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.connection_string">My connection string</property>

      <mapping assembly="NHibernateTesting" />

    </session-factory>
</hibernate-configuration>

最後に、呼び出しを行うコード:

using (var session = NHibernateHelper.GetASession())
{
    using (var tran = session.BeginTransaction())
    {
        var newAccount = new Account();
        newAccount.AccountName = "some name";

        session.Update(newAccount); // Exception thrown here.

        tran.Commit();
    }
}

誰かが私が間違っていることや、なぜこの例外が発生するのかを知ることができます。この問題はマッピングに関連していることをWebで読んだことがありますが、この例では何が間違っているのかわかりません。

4

3 に答える 3

4

あなたが示したように私はすべてのマッピングとコードを再現しました、そしてそれは働いています。それ外:

var newAccount = new Account(); // NEW
...
session.Update(newAccount); // Update throws exception:

NHibernate.StaleStateException:バッチ更新が更新から予期しない行数を返しました。実際の行数:0; 予想:1

新しいオブジェクトは、次の方法で保存する必要があります。session.Save(newAccount);

あなたが言うとき、マッピングファイルは埋め込みリソースとしてマークされています...正確に何が間違っているのかを言うのは難しいです。このリンクを注意深くたどって(そしてプロジェクトを再確認して)、永続性のない例外についてのかなり良い経験チェーンを試してください。

于 2013-01-17T05:35:16.723 に答える
2

このエラーは、マッピング構成が無効なために発生します。セッションファクトリの.Mappingsをどこに設定したかを確認する必要があります。基本的に、プロジェクトで「.Mappings(」を検索し、以下の行で正しいエンティティクラスを指定していることを確認してください。

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>())
于 2014-04-18T12:27:56.103 に答える
0

列名をIdに変更することで、このエラーを解決しました。私が最初にTemplateIdを実行したので、このエラーが表示されましたが、フィールドをIdに変更すると、解決されました。したがって、IDフィールドまたは主キーをIdとして持つことは、nhibernateまたはOrchardの要件です。

于 2015-09-10T07:18:16.540 に答える