基本上这个问题的标题解释了我想要做的事情的本质,但是要创造一个人为的例子......
我有一个班级,称之为员工。员工有IPaymentBehaviour ......
public class Employee
{
IPaymentBehaviour _paymentBehaviour;
protected internal Employee() { /* required by NH */}
public Employee(IPaymentBehaviour paymentBehaviour)
{
_paymentBehaviour = paymentBehaviour;
}
}
这对应于这样的数据库表:
dbo.Employees
- > EmployeeId(主键)
- > PaymentBehaviourId(查找表的外键)
- >字段1
- >字段2
- >字段3
- >字段4
根据PaymentBehaviourId的值,我需要在Employee对象中“注入”不同的IPaymentBehaviour实现。根据正在使用的PaymentBehaviour,可能需要Field1,2,3或4才能创建该行为。
有人能告诉我如何用Fluent-NHibernate映射它吗?
答案 0 :(得分:2)
表员工
表PaymentBehaviour
类
public class Employee
{
/* ... */
public PaymentBehaviour PaymentBehaviour { get; set; }
}
public class PaymentBehaviourA : IPaymentBehaviour
{
/* ... */
public int Field1 { get; set; }
}
public class PaymentBehaviourB : IPaymentBehaviour
{
/* ... */
public int Field2 { get; set; }
}
我不知道FluentNHibernate足以告诉你它是什么样的,但是在XML中你会像这样指定它:
<class name="Employee" table="Employees">
<many-to-one name="PaymentBehaviour" class="IPaymentBehaviour">
</class>
<class name="IPaymentBehaviour" abstract="true" >
<discriminator column="type"/>
<subclass name="PaymentBehaviourA" discriminator-value="A">
<propert name="Field1"/>
</subclass>
<subclass name="PaymentBehaviourB" discriminator-value="B">
<propert name="Field2"/>
</subclass>
</class>
答案 1 :(得分:1)
NHibernate使用默认构造函数来实例化实体。但是有some个解决方法。
答案 2 :(得分:0)
我想我会像这样解决这个问题:
private
访问修饰符,以便NHibernate可以重建这些类型IPaymentBehaviour
实施
进入实体。 (也许你可以
创建一个接口
'IPaymentBehaviourInjectable'即
可以由员工实施
class(明确地实现),所以
你可以注入正确的
进入实体的行为......