如何通过NHibernate持久保存匿名类型实例?

时间:2010-02-12 16:08:32

标签: .net vb.net nhibernate anonymous-types

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

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

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

仅供参考:我在问,因为我必须使用NHibernate编写特定的使用规则,这样的规则即使初学者甚至可以在不了解NHibernate的情况下使用它,但只遵循技术规则和指导我必须制作的文件。

提前感谢您的任何意见和解答。

1 个答案:

答案 0 :(得分:1)

有两种方法。

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

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

假设您有Images表,其中包含图像。它有LengthContentTypeCreatedOnContentDescription和其他列。

在应用的某些部分,您可能只想编辑图像元数据而不实际显示图像本身。因此,出于性能原因,您需要加载元数据部分。但是,您最终会将此保存到数据库中,因此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不适用于大规模更新。