C# Nhibernate,更新子项会产生新的父项

C# Nhibernate,更新子项会产生新的父项,c#,nhibernate,C#,Nhibernate,我是新来的。当我通常更新一个记录(没有child)时,我只是创建一个新对象,设置旧ID,更改所需的值并更新记录。这很有效 当我对我的孩子做同样的事情时,我需要设置家长记录,否则我会得到一个 无法执行批处理命令。[SQL:SQL不可用]错误 为此,我创建了一个新的父对象并设置父对象的Id。我希望这能奏效。没有引发异常,但现在我在数据库中获得了一个新的父记录 我应该在更新之前阅读待更新对象,还是有其他方法?(更新前阅读会消耗一些性能)您正在与NHibernate战斗。这不是更新东西的正确方式。与其自

我是新来的。当我通常更新一个记录(没有child)时,我只是创建一个新对象,设置旧ID,更改所需的值并更新记录。这很有效

当我对我的孩子做同样的事情时,我需要设置家长记录,否则我会得到一个 无法执行批处理命令。[SQL:SQL不可用]错误

为此,我创建了一个新的父对象并设置父对象的Id。我希望这能奏效。没有引发异常,但现在我在数据库中获得了一个新的父记录


我应该在更新之前阅读待更新对象,还是有其他方法?(更新前阅读会消耗一些性能)

您正在与NHibernate战斗。这不是更新东西的正确方式。与其自己实例化对象,不如让NHibernate从DB加载现有数据并将数据填充到对象中:

// do something
// this will create an object, and populate data from database:
var vehicle = session.Get<Vehicle>(vehicleId);
// change the owner:
vehicle.Owner = "John Smith";
和映射:

<class name="Child">
    <id name="Id" unsaved-value="0"><generator class="identity" /></id>
    <property name="Name" />
    <many-to-one name="Parent"/>
</class>
<class name="Parent">
    <id name="Id" unsaved-value="0"><generator class="identity" /></id>
    <property name="Name" />
</class>
这确实会生成一个更新,而无需选择。 现在,如果您知道子项id、父项id和子项的新名称,则可以更新子项,而无需进行任何选择:

session.Update(
    new Child
        {
            Id = childId, 
            Name = "new name", 
            Parent = session.Load<Parent>(parentId)
        });
session.Update(
新生儿
{
Id=childId,
Name=“新名称”,
Parent=session.Load(parentId)
});
说明:通过使用session.Load,我明确地告诉NHibernate不要访问带有键parentId的父记录的数据库,而是给我一个未初始化的代理


因此,实现您想要的是可能的,但我认为这不是一件好事,迟早这段代码会回来咬您,因为当对象模型变得更复杂时,这段代码会产生一些意想不到的行为。

谢谢。我认为你是对的。也许我试图在错误的点上节省一些cpu周期…我的答案没有完成。至少有一种方法可以强制NHibernate更新实体而不考虑任何问题:使用无状态会话。但是,这种方式将破坏任何未准备使用无状态会话的应用程序的会话管理系统。。。我认为你关于咬人的部分是对的,所以我现在先加载,然后更新;)+1用于“Parent=session.Load(parentId)”技巧。谢谢
session.Update(new Parent { Id = parentId, Name = "Parent 1" });
session.Update(
    new Child
        {
            Id = childId, 
            Name = "new name", 
            Parent = session.Load<Parent>(parentId)
        });