C# 在NHibernate中获取每个子类对象的表
我遇到了一个名为ScheduledJobs的DB表,它有无数列和一个匹配的C#对象,这些对象的属性都相同。我对它的设计不感兴趣,我想用每个子类一个表的策略来打破它。而不是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
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);
}