4

Fluent NHibernate を使用して NHibernate マッピングを実行していますが、解決方法がわからない問題に直面しました。問題の単純化されたバージョンは次のとおりです。

私はユーザークラスを持っています:

public class User {
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

これは、関連する Fluent NHibernate クラス マップです。

public class UserMap : ClassMap<User> {
    public UserMap() {
        Id(x => x.Id);
        Map(x => x.FirstName);
        Map(x => x.LastName);
    }
}

2 つの Web フォームがあります。1 つのフォームではユーザーの名を変更でき、2 つ目のフォームではユーザーの姓を変更できます。私が達成しようとしているのは、次のような単純な SQL ステートメントです。

最初のフォームの場合:
UPDATE [users] SET firstname='new first name' WHERE id=1

2 番目の形式の場合:
UPDATE [users] SET lastname='new last name' WHERE id=1

現在、NHibernate はデータベースで次の SQL を実行します。
UPDATE [users] SET firstname=null, lastname='new last name' WHERE id=1

実際のアプリケーションの問題は、いくつかの大きなオブジェクト (およびアクセス制限) で更新するプロパティが多すぎることです。オブジェクト全体を更新するのは無意味に思えます。単一のプロパティ。

どうすればこれを実現できるか、またはこれを解決するための正しい方向に私を向けることができるかについて、誰かがアドバイスを提供できることを願っています。

4

2 に答える 2

0

わかりました。Queen3 のヘルプとヒントに感謝します。

これが私がそれをどのように解決したかです:

using (var sf = Repository.CreateSessionFactory()) { 
    using (var s = sf.OpenSession()) { 
        using (var t = session.BeginTransaction()) { 
            var existingUser = s.Get<User>(editedUser.Id); 
            existingUser.LastName = editedUser.LastName; 
            s.SaveOrUpdate(existingUser); 
            t.Commit(); 
        }
    } 
} 

これは機能しますが、最初にデータベースからユーザーを取得し、同じセッション内で作業する必要があります。良いことは、生成された sql ステートメントがダーティな LastName フィールドを更新するだけであることです。:-)

ユーザーのデタッチされたインスタンスで動作させることができません。これは、以前に行っていた方法と似ており、ユーザーのすべてのフィールドが更新されました。

using (var sf = Repository.CreateSessionFactory()) { 
    using (var s = sf.OpenSession()) { 
        using (var t = session.BeginTransaction()) { 
            s.SaveOrUpdate(editedUser); 
            t.Commit(); 
        }
    } 
}
于 2009-11-11T13:56:05.947 に答える
0

Hibernate は正しいことを行っていますが、問題は、スキーマに正規化が必要であることを示しています。

于 2009-11-10T17:14:02.757 に答える