0

短いバージョン:

エンティティを保存すると、NHibernate 3.3で規則を使用すると、idプロパティが更新されません。

詳細バージョン:

エンティティIDプロパティ

public virtual Guid GuitarId { get; protected set; }

このマッピングを使用すると、エンティティはデータベースに正しく保存されますが、エンティティを読み込もうとしても、エンティティのIDは入力されません。単に無視されます。

    mapper.BeforeMapClass += (model, type, classCustomizer) =>
    {
        classCustomizer.Id(x =>
        {
            x.Column(type.Name + "Id");
            x.Generator(Generators.GuidComb);
        });
    };

保存されたエンティティを取得しようとすると、IDを除くエンティティのすべてのフィールドにデータが入力されます。遅延ロードされたが運がなかった場合に備えて、idプロパティにアクセスしようとしました。

var g = session.Get<Guitar>(existingId);

エンティティのIDマッピングをオーバーライドすると、保存後にidプロパティが正しく入力されます

    mapper.Class<Guitar>(map =>
    {
        map.Id(x => x.GuitarId, x =>
        {
            x.Generator(Generators.GuidComb);
        });
    });

だから問題はBeforeMapClassイベントにあります、何か提案はありますか?

私は何かが足りないのですか?それともこれはバグですか?

4

1 に答える 1

2

規則ベースのブロックでは、主キーを表すプロパティが定義されていません。マッピング先のデータベース列のみであるため、マッピングされていない ID であると見なされます (つまり、NHibernate は ID を認識しており、NHibernate から取得できますが、ドメイン モデルでは表されません)。

手動でマップすると、プロパティが定義され、列はデフォルトで同じ名前を使用します。それが機能する理由です。

この追加の規則により、Id プロパティの定義が処理されます。

mapper.IsPersistentId((mi, d) => mi.Name == mi.DeclaringType.Name + "Id");
于 2012-05-26T13:34:50.487 に答える