本能地,我会说这是不可能的,因为 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/