Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
如何修改我不知道的对象';我不想在nhibernate犯罪?_Nhibernate - Fatal编程技术网

如何修改我不知道的对象';我不想在nhibernate犯罪?

如何修改我不知道的对象';我不想在nhibernate犯罪?,nhibernate,Nhibernate,我让ninject在httpRequest上创建一个新会话,并在httpRequest结束时关闭它 现在我通过nhibernate配置文件了解到,我应该始终将所有内容包装在事务中,甚至包括查询(read) 这在我的代码中造成了很多错误,因为我会从数据库中检索一个对象,然后对该对象进行修改(主要是将utc时间转换为本地时间) 这些修改应该永远不会提交到数据库,但由于我现在将所有读取查询包装在一个事务中,所以当我去从数据库中获取其他内容时,需要提交什么,它会进行提交,并且会看到我的对象发生了更改,并

我让ninject在httpRequest上创建一个新会话,并在httpRequest结束时关闭它

现在我通过nhibernate配置文件了解到,我应该始终将所有内容包装在事务中,甚至包括查询(read)

这在我的代码中造成了很多错误,因为我会从数据库中检索一个对象,然后对该对象进行修改(主要是将utc时间转换为本地时间)

这些修改应该永远不会提交到数据库,但由于我现在将所有读取查询包装在一个事务中,所以当我去从数据库中获取其他内容时,需要提交什么,它会进行提交,并且会看到我的对象发生了更改,并保存了应该永远不会保存到数据库中的更改数据库

我会使用execute,但是我会丢失延迟加载,通常在我实际执行其他一些激活延迟加载的查询之前转换时间


我该怎么办?

NHibernate 3.1在
IQuery
ICriteria
上有一个
SetReadOnly()
方法,确保会话不会持久化查询返回的对象。

NHibernate 3.1有一个
SetReadOnly()
方法,确保会话不会持久化查询返回的对象。

我建议您将查询结果加载到
viewmodel
中,然后在
viewmodel
的属性上将日期转换为本地时间。由于
viewmodel
未连接到nHibernate会话,因此在httpRequest结束提交事务时,您不会更新实体

viewmodel
实际上是一个
DTO
,可以描述为数据的
展平模型

有关更多信息(尤其是有关automapper的答案),请参见此页

编辑您的痛点似乎是在实际显示数据时。当我遇到这些问题时,我总是使用
displayFor
模板。在我看来,我使用的东西大致如下:-

请注意,这是一个人为的例子:-

<h1>Books</h1>
<ul>
@foreach (var book in Model)
{
  <li>@book.Name @Html.DisplayFor(x=> book.UnitPrice, "Price")</li>
}   
</ul>
注意:此视图可以通过辅助对象等执行计算

这给您带来了很多好处,但它确实意味着,在我使用价格的每个地方,我都必须使用显示模板。然而,我觉得更容易记住的是,我需要为我的所有价格、日期等使用一个显示模板,而不是一些可能会错过的命名助手。它总是关于训练/调节你自己

这一切都是可以讨论的,在一天结束时,你需要对自己的工作方式感到舒适。不过,显示模板对我来说似乎更好


我还应该指出,我敦促您将此视为一个显示问题,不要试图提供从数据库检索数据的乱码。

我建议您将查询结果加载到
viewmodel
中,然后在
viewmodel
的属性上将日期转换为本地时间。由于
viewmodel
未连接到nHibernate会话,因此在httpRequest结束提交事务时,您不会更新实体

viewmodel
实际上是一个
DTO
,可以描述为数据的
展平模型

有关更多信息(尤其是有关automapper的答案),请参见此页

编辑您的痛点似乎是在实际显示数据时。当我遇到这些问题时,我总是使用
displayFor
模板。在我看来,我使用的东西大致如下:-

请注意,这是一个人为的例子:-

<h1>Books</h1>
<ul>
@foreach (var book in Model)
{
  <li>@book.Name @Html.DisplayFor(x=> book.UnitPrice, "Price")</li>
}   
</ul>
注意:此视图可以通过辅助对象等执行计算

这给您带来了很多好处,但它确实意味着,在我使用价格的每个地方,我都必须使用显示模板。然而,我觉得更容易记住的是,我需要为我的所有价格、日期等使用一个显示模板,而不是一些可能会错过的命名助手。它总是关于训练/调节你自己

这一切都是可以讨论的,在一天结束时,你需要对自己的工作方式感到舒适。不过,显示模板对我来说似乎更好


我还应该指出,我敦促您将此视为一个显示问题,不要试图提供从数据库检索数据的乱码。

@Dmitry-您有链接吗。我通常把我的东西转换成列表()我不确定是否有NH最新版本的文档。您可以执行类似“criteria.SetReadOnly(true.List()”的操作。这里有一个链接指向Jira中的功能:@Dmitry-它似乎放在我的fluent映射中的属性上。这不起作用,因为有时我需要更新该列。@Dmitry-我使用linq方式,所以我只使用IQueryable而不是Iquery。如果需要更新任何内容,您能否将对象重新附加到会话?@Dmitry-您有链接吗。我通常把我的东西转换成列表()我不确定是否有NH最新版本的文档。您可以执行类似“criteria.SetReadOnly(true.List()”的操作。这里有一个链接指向Jira中的功能:@Dmitry-它似乎放在我的fluent映射中的属性上。这将不起作用,因为有时我需要更新该列。@Dmitry-我使用linq方式,因此我只使用IQueryable而不是Iquery。如果需要更新对象,是否可以将对象重新附加到会话?是的,我已经使用了视图模型和自动映射器。我决定对结果进行转换的一个原因很简单,因为在过去的版本中,转换多次被遗忘,或者多次被用于给出错误的结果。所以我想,一旦你得到了这个对象,就把它转换成本地时间,忘记了必须转换它。第二件事是汽车制造商c