NHibernate和模块化代码

时间:2009-12-11 17:21:53

标签: c# nhibernate object orm

我们正在使用Nhibernate作为数据访问层开发应用程序。

我正在努力解决的一件事就是找到一种方法将2个对象映射到同一个表。

我们有一个适合数据输入的对象,另一个用于更多批处理过程。

该表包含数据条目的所有列以及批处理过程的一些其他信息。

当它处于批处理过程中时,我不想仅将所有数据加载到子集中,但我希望能够更新表中的值。

nhibernate是否支持指向同一个表的多个对象?什么是允许这个?

我前一段时间尝试过,我记得如果你对其中一个对象进行查询,它会加载一倍的数量,但我不确定我没有错过任何东西。

e.g。

10个数据输入对象 + 10个批次对象

所以20个对象而不是10个。

任何人都可以对此有所了解吗?

我应该澄清一下,这些对象是两个不同的对象,在我看来,它们的行为不应该是多态的。但是它们指向同一个数据库记录,更多的是记录在应用程序中具有双重目的,为了逻辑分区,它们应该保持独立。 (对一个域对象的更改不应该炸掉其他模块中的大量屏幕等。)

由于 皮特

2 个答案:

答案 0 :(得分:1)

将多个对象映射到同一个表的简单方法是使用鉴别器列。在表中添加一个额外的列,并使其包含一个值,将其声明为“数据输入”或“批处理”类型。

您将创建两个对象 - 一个用于数据输入和批处理。我不完全确定你如何在常规的NHibernate XML映射中实现它 - 我使用Castle ActiveRecord进行注释,所以你要像这样标记你的对象:

[ActiveRecord("[Big Honking Table]",
    DiscriminatorColumn = "Type",
    DiscriminatorType = "String",
    DiscriminatorValue = "Data Entry")]
public class Data Entry : ActiveRecordBase
{
   //Your stuff here!
}

[ActiveRecord("[Big Honking Table]",
    DiscriminatorColumn = "Type",
    DiscriminatorType = "String",
    DiscriminatorValue = "Batch Process")]
public class Batch Process : ActiveRecordBase
{
   //Also your stuff!
}

以下是使用NHibernate + Castle ActiveRecord的方法:http://www.castleproject.org/activerecord/documentation/trunk/usersguide/typehierarchy.html 请注意,它们使用父对象 - 我认为这不是必要的,但我没有完全按照您描述的方式实现鉴别器列,因此它可能是。

以下是XML中的映射:https://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

您还可以通过映射让NHibernate知道要加载/更新哪些列 - 如果您最终只创建一个大对象。

答案 1 :(得分:0)

我想你可能只是一点点过度工程:

  • 如果您担心性能,那就是过早优化(此外,检索较少的列并不会快得多,至于保存,您可以启用动态更新以仅更新已更改的列)。
  • 如果你试图通过锁定他的选择来保护程序员免受他自己的攻击,那么你的设计就会因为不那么高尚的原因而变得复杂。

简而言之,根据我10年的经验和对你的问题的理解有限,我建议你再考虑做你想做的事。