C# 在NHibernate中获取每个子类对象的表

C# 在NHibernate中获取每个子类对象的表,c#,nhibernate,nhibernate-mapping,joined-subclass,table-per-subclass,C#,Nhibernate,Nhibernate Mapping,Joined Subclass,Table Per Subclass,我遇到了一个名为ScheduledJobs的DB表,它有无数列和一个匹配的C#对象,这些对象的属性都相同。我对它的设计不感兴趣,我想用每个子类一个表的策略来打破它。而不是 public class ScheduledJobs { public int ID { get; set; } // always needed public int JobTypeID { get; set; } // always needed to distinguish A from B pu

我遇到了一个名为ScheduledJobs的DB表,它有无数列和一个匹配的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文件(不流畅,抱歉),以使用:

<?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>
在我的设置中,我有相同的ID(这应该足够了;它仍然是唯一的),但类型对我来说是未知的:我必须获取抽象作业,检查JobTypeID,找到关联的C#子类,然后在该子类下重新蚀刻它

如果我需要的话,我有能力把JobTypeID带来。我仍然需要将该ID与与其关联的作业子类表配对

简言之,我需要能够使我从NHibernate接收的ScheduledJob对象成为正确的子类,并且尽可能少地受到我的干预。在这里使用鉴别器的能力会很好,但官方文件称不允许这样做。这种设计让我觉得我根本上误解了什么;请随意给我指出正确的方向

谢谢

在我的设置中,我有相同的ID(这应该足够了,它仍然是 唯一),但类型对我来说是未知的:我必须获取摘要 job,检查JobTypeID,找到关联的C#子类,然后重新蚀刻 它属于那个子类

实际上,您既不必检查
JobTypeID
,也不必再次获取它。这就是NHibernate的工作:在初始获取时,它将确定适当的派生类型,并自动为您实例化此类型的对象

如果在提取对象后需要查询类型,可以使用C#类型检查和转换:

ScheduledJob job = Repository.ScheduledJob.Get(id);
if (job is ScheduledJobA)
{
      ScheduledJobA jobA = (ScheduledJobA)jobA;
      ProcessJobA(jobA);
}
else if (job is ScheduledJobB)
{
      ScheduledJobB jobB = (ScheduledJobB)jobB;
      ProcessJobB(jobB);
}

你能建立一个
ScheduledJobA
B
存储库并使用
会话吗?直接获取
?这是我必须建立的15个不同的存储库。@spamguy-当我对NHibernate感到满意时,我最终完全放弃了存储库模式。相反,我的业务逻辑代码直接用于ISession对象。我完全同意你的看法。不幸的是,这是一个太大的应用程序,无法以这种方式重写(亲爱的,我不知道这是可能的。我会尝试一下,稍后接受你的回答。谢谢!
ScheduledJob job = Repository.ScheduledJob.Get(id);
if (job is ScheduledJobA)
{
      ScheduledJobA jobA = (ScheduledJobA)jobA;
      ProcessJobA(jobA);
}
else if (job is ScheduledJobB)
{
      ScheduledJobB jobB = (ScheduledJobB)jobB;
      ProcessJobB(jobB);
}