8

プロジェクトにこの機能を追加するために、SQLServerExpressを使用したFluentnhibernateを使用して最初のステップを完了しようとしています。しかし、いくつかのエラーが発生しました。私はnhibernateの初心者なので、しばらくの間問題を解決できませんでした。私は

Id { get; private set; }

アクセサー。そして、このエンティティは、SQLサーバーのID{1,1}列を持つテーブルにマップされます。しかし、Sessionファクトリの作成中に、エラーが発生します。

The following types may not be used as proxies:Entity: method set_Id should be 'public/protected virtual' or 'protected internal virtual'

このプロパティの設定をカプセル化するためにプライベートセッターが使用されていることを理解していますが、なぜこのエラーが発生するのですか?PS:nhibernateの流暢なサイトの例はsqllite dbを使用しており、すべてが問題ありません。

4

2 に答える 2

20

これは、私を含む多くの NH/FNH ユーザーを悲しませてきた問題です。

最近まで、NHibernate はプロキシ オブジェクトを持つプライベート セッターを許可していました。しかし、NH 3.2 以降では、プライベート セッターは許可されなくなりました。エラー メッセージにあるように、"' public/protected virtual' または 'protected internal virtual '" である必要があります。

これは、公開されている多くの FNH/NH サンプル コードに対する重大な変更であり、初心者にとっては特に混乱を招きます。

于 2012-04-20T14:45:16.383 に答える
7

プロパティを として宣言しますpublic virtual int Id { get; protected set; }。NHibernate によって生成されたプロキシ オブジェクトは、プロパティを設定できるようになります。

別の解決策は、バッキング フィールドを使用することです。

private int id;
public int Id
{
  get { return id; }
}

次に、マッピングを使用します。

Map(x => x.Id).Access.CamelCaseField(); 
于 2012-04-19T13:36:07.003 に答える