我正在使用棕地数据库,并尝试配置一个子类映射,该映射使用指定 ID 以外的列连接到其子类。该login
表有一个主键列login_sk
,我想将其用作其 ID。它通过一列连接到两个表login_cust_id
(为了使事情更有趣,相邻表中的相应列的名称不同)。如果我设置login_cust_id
为 UserMap 的 id,它会按预期加入其子类。出于我希望的明显原因,我不想将login_cust_id
其用作我的 User 对象的 id。
public class UserMap : ClassMap<IUser>
{
public UserMap()
{
Table("login");
Id(x => x.Id).Column("login_sk"); // want to setup map like this
// if used instead this works for subclass joining / mapping
// Id(x => x.Id).Column("login_cust_id");
// would prefer to only reference login_cust_id for subclass mapping
}
}
public class CustomerUserMap : SubclassMap<CustomerUser>
{
public CustomerUserMap()
{
Table("customer");
Map(c => c.DisplayName, "cust_mail_name");
Map(c => c.RecordChangeName, "cust_lookup_name");
KeyColumn("cust_id");
}
}
public class EntityUserMap : SubclassMap<EntityUser>
{
public EntityUserMap()
{
Table("entity");
Map(c => c.DisplayName, "entity_name");
KeyColumn("entity_id");
}
}
我想做的只是login_cust_id
在加入子类时使用该列。是否有一个流畅的映射设置允许我指定这个?如果不是流利的映射,是否有常规的 NHibernate XML 映射可以工作?我什至宁愿不映射该列,并且仅在可能的情况下将其用于加入。如果有帮助,则有一个潜在的鉴别器列login_holder_type
,它指示要加入哪个表。
我确实想到设置一个,IClassConvention
但是在戳过去之后,IClassInstance
我无法确定任何对我有帮助的设置。
public class UserIdConvention : IClassConvention, IClassConventionAcceptance
{
public void Apply(IClassInstance instance)
{
// do something awesome with instance.Subclasses to
// specify the use of login_cust_id for subclass joining...
}
public void Accept(IAcceptanceCriteria<IClassInspector> criteria)
{
criteria.Expect(x => typeof(User).Equals(x.EntityType));
}
}
传递的实例缺少填充的子类集合导致我寻找一个看起来更具体的检查器IParentInspector
。不幸的是, Fluent NHibernate似乎没有对应的实现IParentInstance
,IParentConvention
或者IParentConventionAcceptance
像它一样IJoinedSubclassInspector
。虽然我可能可以在我这样做之前实现我自己的,但我想确保我没有在错误的树上吠叫。
这种子类ID调整甚至可能吗?我是否在我的地图或Fluent NHibernate Conventions 命名空间中遗漏了一些明显的东西?如何映射到具有与父 ID 不同的列/属性的连接子类?