【发布时间】:2014-09-10 20:55:55
【问题描述】:
我遇到了一个名为 ScheduledJobs 的数据库表,其中包含大量列和一个匹配的 C# 对象,具有相同的大量属性。我对它的设计并不感到兴奋,我想使用一个表每个子类的策略来分解它。而不是
public class ScheduledJobs
{
public int ID { get; set; } // always needed
public int JobTypeID { get; set; } // always needed to distinguish A from B
public int Foo { get; set; } // needed by Job A
public int Bar { get; set; } // needed by Job B
}
我有
public abstract class ScheduledJob
{
public int ID { get; set; }
public ScheduledJobType JobType { get; set; }
}
public class ScheduledJobA : ScheduledJob
{
public int Foo { get; set; }
}
public class ScheduledJobB : ScheduledJob
{
public int Bar { get; set; }
}
我重写了 NHibernate .hbm.xml 文件(没有 Fluent,抱歉)来使用:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="ScheduledJob" table="ScheduledJobs" abstract="true" lazy="false">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="identity" />
</id>
<many-to-one name="ScheduledJobType" column="JobTypeID" class="ScheduledJobType" />
<joined-subclass name="ScheduledJobA" table="ScheduledJobsA" lazy="false">
<key column="JobID" />
<property name="Foo" type="Int32" />
</joined-subclass>
<joined-subclass name="ScheduledJobB" table="ScheduledJobsB" lazy="false">
<key column="JobID" />
<property name="Bar" type="Int32" />
</joined-subclass>
</class>
</hibernate-mapping>
太棒了!我的麻烦是,我不知道如何明智地获取子类作业。一张大表的好处是不必担心类型或转换:
ScheduledJob job = Repository.ScheduledJob.Get(id);
在我的设置中,我有相同的 ID(应该足够了;它仍然是唯一的),但我不知道类型:我必须获取抽象作业,检查 JobTypeID,找到关联的 C# 子类,然后重新获取它在那个子类下。
如果需要,我可以引入 JobTypeID。我仍然需要将该 ID 与与之关联的作业子类表配对。
简而言之,我需要能够让我从 NHibernate 收到的 ScheduledJob 对象成为正确的子类,而我的干预尽可能少。在这里使用鉴别器的能力会很棒,但官方文档说不允许这样做。这种设计让我觉得我从根本上误解了一些东西;请随时为我指明正确的方向。
谢谢!
【问题讨论】:
-
你能建立一个
ScheduledJobA和B存储库并直接使用session.Get<ScheduledJobA>吗? -
我必须构建 15 个(并且还在增加)不同的存储库。
-
@spamguy - 随着我对 NHibernate 的熟悉,我最终完全放弃了存储库模式。相反,我的业务逻辑代码直接使用 ISession 对象。
-
我完全同意你的看法。不幸的是,以这种风格重写的应用程序太大了。 :(
标签: c# nhibernate nhibernate-mapping joined-subclass table-per-subclass