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

如何在不更新整个对象的情况下更新Fluent NHibernate中类的特定字段?,nhibernate,orm,fluent,Nhibernate,Orm,Fluent,我正在使用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

我正在使用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);
    }
}
公共类用户映射:类映射{
公共用户映射(){
Id(x=>x.Id);
Map(x=>x.FirstName);
Map(x=>x.LastName);
}
}
我有两个网络表单。一个表单允许我更改用户的名字,第二个表单允许我更改用户的姓氏。我试图实现的是一个简单的SQL语句,如下所示:

对于第一种形式:
UPDATE[users]设置firstname='new first name',其中id=1

对于第二种形式:
UPDATE[users]设置lastname='new lastname',其中id=1

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

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


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

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

好的,这很有效,感谢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(); 
        }
    } 
} 

感谢您对Mcwafflestix的评论。我不确定我是否正确地提出了这个问题,只是为了确认我不太关心规范化,在我的例子中,这是一种设计上的性能权衡。正确使用时,反规范化确实有许多优点。;-。除了“规范化”问题之外,您是否可以建议任何可能的补救措施来优化NHibernate查询?一般来说,我仍然建议进行规范化。事情是这样的;您是对的,非规范化表有很多优点,但使用它们的缺点之一是很难为它们定制现成的解决方案(如Hibernate)。我建议你需要权衡你的权衡;维护非规范化数据库(并且需要自定义Hibernate的表访问)比规范化模式(并且能够按原样使用Hibernate)更重要吗?只有你才能做出决定;我站在“正常化”这一边。更多讨论请参见此处:。此外,我真的不明白为什么你要交易的简单性和做大量的手工工作马上-你有没有尝试过的解决方案?动态更新对您不起作用吗(FNH中的mapping.DynamicUpdate())?我刚刚仔细检查了我的代码。我已经导出了FNH映射,它们启用了动态更新,但这似乎没有任何区别。只是重写我的存储库,这样我就可以使用相同的会话,看看更新之前选择是否会有所不同。
using (var sf = Repository.CreateSessionFactory()) { 
    using (var s = sf.OpenSession()) { 
        using (var t = session.BeginTransaction()) { 
            s.SaveOrUpdate(editedUser); 
            t.Commit(); 
        }
    } 
}