我正在开发一个 NHibernate 项目,并且有一个关于更新瞬态实体的问题。
基本上工作流程如下:
- 创建一个 DTO(投影)并通过网络发送给客户端。这具有来自实体的一小部分属性。
- 客户端发回更改后的 DTO
- 将 DTO 属性映射回适当的实体,以便 NH 生成和执行 UPDATE 语句。
- 保存实体
第 4 点是我遇到问题的地方。目前我可以使用 session.Merge() 方法来实现这个更新,但是在更新之前它必须首先从数据库加载实体(假设没有 2LC)。因此,select 和 update 语句都会被触发。
我想做的是创建实体的临时实例,从 DTO 映射新值,然后让 NH 仅使用我更改的属性生成 SQL 语句。额外的选择应该是不必要的,因为我已经有了实体 ID 和 SET 子句所需的值。这在NH可能吗?
当前使用 session.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();
}
我希望生成类似于“UPDATE Persons SET Firstname = 'Bob' WHERE PersonID = 1”的 SQL 语句。相反,由于 BirthDate 未初始化,我得到了 DateTime 超出范围的异常。它不需要 BirthDate,因为 SQL 语句不需要它。也许这是不可能的?
== /编辑 ==
在此先感谢,约翰