NHibernate-将特定属性标记为“脏”

NHibernate-将特定属性标记为“脏”,nhibernate,dto,transient,Nhibernate,Dto,Transient,我正在从事一个NHibernate项目,对更新临时实体有疑问 基本上,工作流程如下所示: 创建一个DTO投影并通过线路发送到客户端。这包含实体中的一小部分属性。 客户端将更改的DTO发送回 将DTO属性映射回适当的enitity,以便NH可以生成并执行UPDATE语句。 保存实体 第四点是我的问题所在。目前,我可以使用session.Merge方法实现此更新,但是在更新之前,它必须首先从db ASSUBE no 2LC加载实体。因此,select和update语句都被激发 我想做的是创建实体的临

我正在从事一个NHibernate项目,对更新临时实体有疑问

基本上,工作流程如下所示:

创建一个DTO投影并通过线路发送到客户端。这包含实体中的一小部分属性。 客户端将更改的DTO发送回 将DTO属性映射回适当的enitity,以便NH可以生成并执行UPDATE语句。 保存实体 第四点是我的问题所在。目前,我可以使用session.Merge方法实现此更新,但是在更新之前,它必须首先从db ASSUBE no 2LC加载实体。因此,select和update语句都被激发

我想做的是创建实体的临时实例,映射DTO中的新值,然后让NH仅使用我更改的属性生成SQL语句。额外的select应该是不必要的,因为我已经有了实体ID和SET子句所需的值。这在NH有可能吗

当前正在使用session.Update,所有属性都将包含在Update语句中,并且由于未初始化的属性不是DTO的一部分而引发异常

本质上,我需要一种方法来指定哪些实体属性是脏的,以便更新中只包含这些属性

==编辑==

例如

public class Person
{
    public virtual int PersonId { get; set; }
    public virtual string Firstname { get; set; }   
    public virtual string Nickname { get; set; }    
    public virtual string Surname { get; set; } 
    public virtual DateTime BirthDate { get; set; }     
}
以及测试用例

// Create the transient entity
Person p = new Person()
p.id = 1;

using (ISession session = factory.OpenSession())
{
    session.Update(p);

    // Update the entity – now attached to session    
    p.Firstname = “Bob”;

    session.Flush();
}
我希望生成一个类似于“updatepersonsetfirstname=”Bob“wherepersonid=1”的SQL语句。相反,我得到了一个DateTime超出范围的异常,因为生日没有初始化。它不需要生日,因为SQL语句不需要生日。也许这是不可能的

==/编辑==

提前感谢,,
John

动态更新是您需要的。在映射文件hbm.xml中:

<class name="Foo" dynamic-update="true">
   <!-- remainder of your class map -->

动态更新是您需要的。在映射文件hbm.xml中:

<class name="Foo" dynamic-update="true">
   <!-- remainder of your class map -->

使用它也会对性能产生影响,我认为使用静态更新总体上更具性能,因为nhibernate在构建sessionfactory时准备更新语句的方式。嗨,James,感谢您的回复。我为实体设置了DynamicUpdate fluent映射。也许一个例子可以更清楚地说明这个问题。请参阅上面编辑的部分。我必须同意,在这种情况下,API不是直观的;我已经在我的“真实世界”应用程序中使用session.Lock进行了测试,它返回的正是我想要的SQL。非常感谢您在这方面的帮助,James。使用它也会对性能产生影响,我相信使用静态更新总体上更具性能,因为nhibernate在构建sessionfactory时准备更新语句的方式。嗨,James,感谢您的回复。我为实体设置了DynamicUpdate fluent映射。也许一个例子可以更清楚地说明这个问题。请参阅上面编辑的部分。我必须同意,在这种情况下,API不是直观的;我已经在我的“真实世界”应用程序中使用session.Lock进行了测试,它返回的正是我想要的SQL。非常感谢你在这方面的帮助,詹姆斯。
UPDATE Person
SET    Firstname = 'Bob' /* @p0_0 */
WHERE  PersonId = 1 /* @p1_0 */