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

标签 .net vb.net nhibernate anonymous-types

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

相关文章:

c# - 使用 MSBuild,我可以签署一个在文件中指定密码的应用程序吗?

c# - 如何在 WPF TextBox 中模拟粘贴?

.net - .NET 4 中是否有二叉搜索树实现?

nhibernate - nhibernate 是否可以将查询作为 IDictionary 而不是实体类返回?

c# - Nhibernate 抛出类型为 'System.Linq.EnumerableQuery` 的对象 1[实体 ]' cannot be converted to type ' System.Linq.IQueryable`1[System.Object[]]'

c# - MonthGenitiveNames 和 MonthNames 之间有什么区别?为什么月份有空白?

c# - 代码在 Windows 服务项目中不起作用

.net - VB.NET - 你如何从另一个线程读取一个值

.net - 为什么 try/catch 没有捕获访问冲突?

c# - 在另一个程序集中扩展流畅的 nhibernate 映射