我遇到了解决我遇到的问题的良好文档的问题。我正在重构企业解决方案的一部分,并为我们的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一致。
答案 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是否是唯一的,或者它是否是复合词