代码之家  ›  专栏  ›  技术社区  ›  Dai Bok

如何在不更新整个对象的情况下更新Fluent NHibernate中类的特定字段[[副本]

  •  4
  • Dai Bok  · 技术社区  · 16 年前

    我有一个用户类:

    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);
        }
    }
    


    UPDATE [users] SET firstname='new first name' WHERE id=1

    第二种形式:
    UPDATE [users] SET lastname='new last name' WHERE id=1

    目前,NHibernate在我的数据库上执行以下SQL:
    UPDATE [users] SET firstname=null, lastname='new last name' WHERE id=1

    现实世界应用程序中的问题是,在一些大对象上有太多的属性需要更新(以及访问限制),而当我只想/被允许更新单个属性时,更新整个对象似乎毫无意义。

    我希望有人能为我提供一些建议,告诉我如何实现这一点,或者为我指出解决这一问题的正确方向。

    2 回复  |  直到 9 年前
        1
  •  0
  •   Paul Sonier    16 年前

    Hibernate做的是正确的,但是您的问题表明您的模式需要一些规范化。

        2
  •  0
  •   Dai Bok    16 年前

    好的,那就行了,谢谢你的帮助和提示!

    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(); 
            }
        } 
    }