2

データアクセス層としてNHを使用していますが、主キーとしてGUIDタイプに問題があるようです。

public partial class Member
    {
        public virtual Guid UserId { get; set; }
        public virtual string UserName { get; set; }
    }

 public MemberMapping()
        {
            Id(x => x.UserId).GeneratedBy.GuidComb();
            Map(x => x.UserName).Length(20).Not.Nullable();
        }

どうやら、UserIdを次のマッピングに変更した場合でも:

Id(x => x.UserId).GeneratedBy.Assgined();

次に、UserIdを自分で初期化すると、memberタイプのオブジェクトの保存が開始されません...

しかし、UserIdにIntデータ型を使用すると、正しく保存されます。

guidをid-fluent-nhiberateの質問としてデータベースに保存しないを読み、Save()メソッドを使用してGUIdDをキーとしてメンバーエンティティを保存しましたが、機能しません。

よろしくお願いします。

4

2 に答える 2

3

フォローアップコメントでリンクするページは、セッションの作成と挿入に関するものです。「トランザクション」や「コミット」については一切触れていません。常にNHibernateトランザクションを使用する必要があります。デフォルト設定では、トランザクションをコミットすると、セッションがトリガーされ、データベースへの変更がすべてフラッシュされます。フラッシュは変更がデータベースに送信されることが保証されている唯一のステップであるため、これは必要なステップです。

フラッシュの詳細:http: //nhibernate.info/doc/nh/en/index.html#manipulatingdata-flushing

于 2012-11-11T13:24:50.660 に答える
1

これは実際には私の側の大きな見落としでした。私のエンティティはすべてネイティブ ID 生成を使用していたため、トランザクションをフラッシュしたことがなくても、保存時に挿入されました。(ルールの例外。この優れた説明を参照してください: https://stackoverflow.com/a/43567/1015595 )

一方、Member エンティティは ID を Guid にマップします。その場合、オブジェクトは期待どおりに動作し、トランザクションがフラッシュされるまで保持されません。

オスカーが彼の答えで言ったように、何かを保存しようとする前にトランザクションを開始し、後でトランザクションをコミットする必要があります。保存を try-catch ステートメントでラップすることをお勧めします。

// Adds sample data to our database
public ActionResult Seed()
{
    ...

    StoreRepository.BeginTransaction();

    try
    {
        StoreRepository.SaveOrUpdateAll( barginBasin, superMart );

        StoreRepository.Commit();

        return RedirectToAction( "Index" );
    }
    catch
    {
        StoreRepository.Rollback();

        return RedirectToAction( "Error" );
    }
}

リポジトリに追加する必要があるメソッドは次のとおりです。

public void BeginTransaction()
{
    Session.BeginTransaction();
}

public void Commit()
{
    Session.Transaction.Commit();
}

public void Rollback()
{
    Session.Transaction.Rollback();
}

これらのメソッドをリポジトリに保持して、コントローラーをテスト可能な状態に保つ必要があります。

その記事を書いたとき、私は NH トランザクションについて何も知りませんでした。私をつまずかせたのは、ウィンザー城のドキュメントの次の部分でした。

今行ったことの目に見えない効果ですが、重要な点が 1 つあります。コンポーネントを登録することで、Windsor にコンポーネントの作成方法を指示しただけではありません。また、Windsor はインスタンスの適切な破棄も処理してくれるので、インスタンスの完全なライフタイムを管理してくれます。簡単に言うと、Windsor は、使用されなくなった両方のオブジェクトを破棄します。これは、ISession に加えた変更をデータベースにフラッシュし、ISessionFactory をクリーンアップすることを意味します。そして、これらすべてを無料で入手できます。

あなたが私に尋ねると、かなり誤解を招く。

于 2012-11-28T20:24:18.243 に答える