Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nhibernate:直接更新子实体而不使用反向_C#_.net_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# Nhibernate:直接更新子实体而不使用反向

C# Nhibernate:直接更新子实体而不使用反向,c#,.net,nhibernate,fluent-nhibernate,C#,.net,Nhibernate,Fluent Nhibernate,我正在使用fluent nhibernate将父子关系映射到sql数据库。 大多数时候,我让父实体保存它的子实体,它们被插入到一个事务中,如果我没有弄错的话,如果我使用.Inverse()和sql标识列,这是不可能的。 我遇到的问题是,在1种特定情况下,我希望更新子实体,而只更新子实体。 当我使用当前设置执行此操作时,子记录将失去与其父对象的关系(如果父对象为null),或者将完全替换父对象(如果我插入一个仅具有id的虚拟父对象)。 有人知道在不影响外键的情况下实现单个记录更新的方法吗? 我可以

我正在使用fluent nhibernate将父子关系映射到sql数据库。
大多数时候,我让父实体保存它的子实体,它们被插入到一个事务中,如果我没有弄错的话,如果我使用.Inverse()和sql标识列,这是不可能的。

我遇到的问题是,在1种特定情况下,我希望更新子实体,而只更新子实体。
当我使用当前设置执行此操作时,子记录将失去与其父对象的关系(如果父对象为null),或者将完全替换父对象(如果我插入一个仅具有id的虚拟父对象)。

有人知道在不影响外键的情况下实现单个记录更新的方法吗?
我可以想到手动sql语句或存储过程,但我希望有一种nhibernate方法

我有以下设置(为方便起见进行了简化):

publicprojectmap()
{
表(“项目”);
Id(p=>p.Id);
有很多(p=>p.Risks);
}
公共风险地图()
{
表(“项目风险”);
Id(r=>r.Id);
参考文献(r=>r.Project)。列(“ProjectId”);
Map(r=>r.Description);
}
公共类项目
{
公共虚拟整数Id{get;set;}
公共虚拟IList风险{get;set;}
}
公共类风险
{
公共虚拟整数Id{get;set;}
公共虚拟字符串描述{get;set;}
公共虚拟项目{get;set;}
}

正如Miroslav建议的那样,我现在正在使用HQL更新语句。

这对我来说有点混乱,但它完成了任务

Session.CreateQuery("update Risk set Closed = :completed where Id = :id")
                    .SetInt32("id", id)
                    .SetBoolean("completed", completed)
                    .ExecuteUpdate();

你想干什么?你能把有问题的代码贴出来吗?在更新从db加载的现有风险时,如果不手动设置项目属性,则项目属性应保持不变。因为我在两者之间使用soap服务(这是一项硬要求),所以我不会序列化项目属性。如果我这样做了,那么所有的子项都将有它的父项,我将有一个无休止的序列化循环(更不用说传输的数据了)。即使引用对象在那里,如果做了任何其他更改,它仍然会得到更新。为了明确我在做什么:mvc网站通过soap服务加载项目。在客户端单击时,它会将1个风险对象发送回Web服务器以保存在数据库中。然后,您可能应该使用其Id从数据库加载风险,使用发送的实例更新其属性并保存它。或者,如果性能非常关键,请执行HQL更新:我通常所做的是,在映射DTO(在我的例子中是视图模型)时,首先从存储库中按ID加载实体,然后使用AutoMapper将所有其他属性从DTO映射到域实体。
Session.CreateQuery("update Risk set Closed = :completed where Id = :id")
                    .SetInt32("id", id)
                    .SetBoolean("completed", completed)
                    .ExecuteUpdate();