本能地,我会说这是不可能的,因为NHibernate需要知道一些关于如何持久化给定类型的映射信息。因此,我遇到了一些可以使用这种功能的情况。例如,通过命名查询或类似的东西。另一方面,使用命名查询将要求我添加配置文件。
假设我们有一个应用程序与一些底层数据存储区交互。此数据存储区通过NHibernate配置文件进行配置。然后,我希望NHibernate只加载一个实体属性的子集,从我的应用程序不需要多次交互的另一个子系统,所以不值得为这个系统定义类,因为我只需要一小部分这个外星系统的信息,比方说三十二个数据列中的三个。就此而言,如果我选择只加载那三列,那就说出性能问题,我会使用匿名类型,对这些信息执行必要的操作,然后将其保留回数据存储区。现在,如果我只有一个实体从数据存储中加载,那么这样做就没有多大意义了,所以假设我有大约75,000行要加载到我的进程中。然后我会认真考虑这个子集选项!
如果您需要将这些更改仅保留到此实体属性的子集中,您应该在这种情况下选择哪种策略?
仅供参考:我在问,因为我必须使用NHibernate编写特定的使用规则,这样的规则即使初学者甚至可以在不了解NHibernate的情况下使用它,但只遵循技术规则和指导我必须制作的文件。
提前感谢您的任何意见和解答。
答案 0 :(得分:1)
有两种方法。
首先,如果您需要选择实体并且不打算将它们保留回数据库,则可以使用select new
HQL构造。因此,您将能够指定从DB加载哪些属性。
第二种方法有点复杂,下面的例子可以更好地说明。
假设您有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不适用于大规模更新。