Fluent-NHibernate基于另一列的多级继承

时间:2013-11-20 20:53:44

标签: inheritance fluent-nhibernate

我遇到了解决我遇到的问题的良好文档的问题。我正在重构企业解决方案的一部分,并为我们的ORM交换NHibernate。我有3张桌子,我希望彼此都能继承。

MasterAccount:帐户:InvBilling

**MasterAccount**
id_MasterAccount

**Account**
id_Account
id_MasterAccount
id_InvBilling

**InvBilling**
id_InvBilling
id_MasterAccount

对于MasterAccount中的每一行,Account中存在一行,其中Id_MasterAccount列相等且IsMaster列为1.但是,Account表中还有其他记录,其id_MasterAccounts也等于与其父帐户关联。最后,Account表中的每条记录都在InvBilling表中有一条记录。

我在设置映射时遇到了很多问题。有关如何设置的任何帮助吗?

我需要告诉MasterAccount它应该关联哪个帐户记录以及它应该使用的列。

编辑:这是我到目前为止所拥有的:

public class MasterAccountEntity : AccountEntity{
    protected virtual int MAId {get;set;}
}

public class AccountEntity : InvBillingEntity{
    protected virtual int AId {get;set;}
    public virtual MasterAccountEntity MA {get;set;}
    public virtual InvBillingEntity IB {get;set;}
    public virtual bool IsMaster {get;set;}
}

public class InvBilling{
    protected virtual int IBId {get;set;}
    public MasterAccountEntity MA {get;set;}
}

然后是我的映射(有点失去了如何显示继承):

public class FluentHibernateMap : SubclassMap<MasterAccountEntity>{
    Table("MasterAccount");
    Map(x => x.MAId).Column("id_MasterAccount");
}

public class FluentHibernateMap : SubclassMap<AccountEntity>{
    Table("Account");
    Map(x => x.AId).Column("id_Account");
    Map(x => x.IsMaster).Column("isMaster");
    References(x => x.MA).Column("id_MasterAccount").Not.Nullable().Cascade.None();
    References(x => x.IB).Column("id_InvBilling").Not.Nullable().Cascade.None();
}

public class FluentHibernateMap : ClassMap<InvBillingEntity>{
    Table("InvBilling");
    Id(x => x.IBId).Column("id_InvBilling");
    References(x => x.MA).Column("id_MasterAccount").Not.Nullable().Cascade.None();
}

因此,MasterAccount需要从IsMaster为true的Account继承记录,然后继承InvBilling中的记录,该记录与Account中的InvBillingId一致。

1 个答案:

答案 0 :(得分:1)

帐户表是一个版本控制表,它有效地表达了主表的许多方面。我会反映这一点,而不是试图在映射中隐藏它。然后,如果没有必要,就不可能对历史记录和复杂性上升做任何事情。

public class Entity
{
    protected virtual int Id { get; private set; }  // should be readonly once set by NHibernate
}

public class AccountMasterEntry : Entity
{
    public virtual Account ActiveAccount { get; private set;}
}

public class Account : Entity
{
    public virtual AccountMasterEntry MA {get;set;}
    public virtual InvBillingEntity IB {get;set;}
    public virtual bool Active {get;set;}
}

public class InvBilling : Entity
{
}

public class AccountMasterEntryMap : ClassMap<AccountMasterEntry>
{
    public AccountMasterEntryMap()
    {
        Id(x => x.Id).GeneratedBy...;

        // optional
        References(x => x.ActiveAccount).Formula("(SELECT acc.id_Account FROM Account acc WHERE id_MasterAccount = acc.id_MasterAccount AND acc.IsMaster = 1)");
    }
}

public class AccountMap : ClassMap<Account>
{
    public AccountMap()
    {
        Id(x => x.Id).GeneratedBy...;

        References(x => x.MA, "id_MasterAccount");
        References(x => x.IB, "id_InvBilling");
        Map(x => x.Active, "ismaster");
    }
    public virtual AccountMasterEntry MA { get; set; }
    public virtual InvBilling IB {get;set;}
    public virtual bool IsMaster {get;set;}
}

public class InvBilling : Entity
{
}

// query
int masterId = ...;
var accountrecord = session.Query<Account>()
    .Where(a => a.MA.Id == masterId && a.Active)  // NHibernate should be smart enough to see that there is no join needed
    .Single();

注意:我不确定invbillingId是否是唯一的,或者它是否是复合词