使用Fluent NHibernate映射策略模式

时间:2009-05-04 08:13:24

标签: nhibernate fluent-nhibernate nhibernate-mapping

基本上这个问题的标题解释了我想要做的事情的本质,但是要创造一个人为的例子......

我有一个班级,称之为员工。员工有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映射它吗?

3 个答案:

答案 0 :(得分:2)

表员工

  • EmployeeId(主键)
  • PaymentBehaviourId(PaymentBehaviour的外键)

表PaymentBehaviour

  • PaymentBehaviourId(pk)
  • type(discriminator)
  • 字段1
  • 字段2
  • 字段3
  • 字段4

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可以重建这些类型
  • 在重载适当方法的位置创建一个Interceptor (OnLoad I pres),你在其中制作 确保你注射正确的 IPaymentBehaviour实施 进入实体。 (也许你可以 创建一个接口 'IPaymentBehaviourInjectable'即 可以由员工实施 class(明确地实现),所以 你可以注入正确的 进入实体的行为......