gpt4 book ai didi

.net - 如何通过 NHibernate 持久化匿名类型实例?

转载 作者:行者123 更新时间:2023-12-02 04:17:21 26 4
gpt4 key购买 nike

本能地,我会说这是不可能的,因为 NHibernate 需要知道一些关于如何持久化给定类型的映射信息。因此,我遇到了一些可以使用这种功能的情况。例如,通过命名查询或类似的东西。另一方面,使用命名查询需要我对配置文件进行添加。

假设我们有一个应用程序与一些底层数据存储进行交互。此数据存储通过 NHibernate 配置文件进行配置。然后,我希望 NHibernate 仅从另一个子系统加载实体属性的一个子集,我的应用程序不需要与该子系统进行太多交互,因此不值得为该系统定义类,因为我只需要一小部分这个外星系统的信息,比如说三十二列数据中的三列。就此而言,如果我选择仅加载这三列,假设出于性能考虑,我将使用匿名类型,对此信息执行所需的操作,然后将其持久化回数据存储区。现在,如果我只有一个实体要从数据存储中加载,那么这样做并没有多大意义,所以假设我有大约 75,000 行要加载到我的进程中。然后我会非常认真地考虑这个子集选项!

在这种情况下,如果您需要将这些更改仅保留到该实体属性的子集,您应该选择什么策略?

仅供引用:我之所以这么问,是因为我必须编写 NHibernate 的具体使用规则,这样的规则即使是初学者也可以在不太了解 NHibernate 的情况下使用它,但只需遵循我拥有的技术文档的规则和指导生产。

提前感谢您的任何评论和答案。

最佳答案

对此有两种方法。

首先,如果您需要选择实体并且不打算将它们持久化回数据库,您可以使用 select new HQL构造。因此,您将能够指定从数据库加载哪些属性。

第二种方法有点复杂,下面的例子可以更好地说明。

假设您有 Images表,其中自然包含图像。它有 Length , ContentType , CreatedOn , Content , Description和其他列。

在您的应用程序的某些部分,您可能只想编辑图像元数据而不实际显示图像本身。因此,出于性能原因,您只需要加载元数据部分。但是,您最终会将其保存到数据库中,因此 select new方法行不通。但是,可行的是:

class ImageMetadata
{
public string ContentType { get; set; }
public string Description { get; set; }

// Etc
}

class Image : ImageMetadata
{
// To native English speakers out there: is it "Content" or "Contents"?
public byte[] Content { get; set; }
}

在这里,您必须将两个类映射到同一个底层数据库表,然后加载 ImageMetadata或全部 Image视情况而定。

诚然,这不能很好地扩展,但它可以让你避免很多性能问题。

至于 75 000 个实体:ORM 不适用于大规模更新。

关于.net - 如何通过 NHibernate 持久化匿名类型实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2253151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com