【发布时间】:2011-09-06 03:48:58
【问题描述】:
我们想在我们的应用程序中使用 NHibernate 作为我们的持久层。我们还使用 Fluent NHibernate 进行映射。
我们从第 3 方获取 Person 数据,我们需要将数据保存到我们的数据库中。在代码中将所有属性都放在一个对象上效果更好,但将数据保存到数据库中的 2 个表中更有意义。
我们的对象如下所示:
public class Person
{
public virtual long VersionNumber { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string IdentificationNumber { get; set; }
}
我们的数据库表如下所示:
CREATE TABLE PersonVersion (
[PK] VersionNumber bigint NOT NULL,
[FK] PersonDemographicsId int NOT NULL
)
CREATE TABLE PersonDemographics (
[PK] PersonDemographicsId int NOT NULL,
IdentificationNumber nvarchar(9) NOT NULL,
FirstName nvarchar(100) NOT NULL,
LastName nvarchar(100) NOT NULL
)
当我们收到新数据时,版本号可能会发生变化,但其他人口统计数据可能相同。我们需要 NHibernate 做的是将新记录保存到链接到现有 PersonDemographics 记录的 PersonVersion 表中。如果人口统计数据发生了变化,那么我们将在两个表中创建一条新记录。但大多数情况下,一旦我们下载了初始数据,人口统计数据就不会像版本号那样频繁变化。我们需要跟踪所有版本号,因此有必要创建一个新的PersonVersion 记录。
我们将如何使用 NHibernate 和使用 Fluent NHibernate 的映射来完成此任务?
另外,如您所见,我们的 Person 对象目前没有PersonDemographicsId,因为我们的应用程序根本不需要它;它只是数据库中需要的表关系的ID。为了在 NHibernate 中正确映射它,我们是否必须在 Person 对象上添加 PersonDemographicsId 属性?
感谢您的帮助!
【问题讨论】:
-
除非 PersonDemographics 有一些您没有显示的大量 BLOB 数据,否则我建议您考虑将版本号展平到该表中。在每个请求上加入和/或子查询的成本加上重建历史状态的复杂性(我什至看不到您描述的模型如何实现)可能超过通过保留更少数据获得的任何小好处.
-
是的,我确实遗漏了一些属性,但都是简单类型;没有 BLOB 数据。我们决定使用这个模型的原因是因为我们将要处理的记录数量。每年,我们的数据库中都会有 600,000 到 1,000,000 个不同的人,每个人全年都有多个版本。大多数时候人口统计数据不会改变,但有时会改变。如果我们将这些表扁平化为 1,我们将拥有大量重复数据。从存储的角度来看,仅仅为了版本更改而不断复制人口统计数据是没有意义的。
标签: c# .net nhibernate orm fluent-nhibernate