地图使用功能NHibernate

问题描述:

本质这个问题的标题说明了什么,我试图做一个essense策略模式,而是要创造一个人为的例子...地图使用功能NHibernate

我有一个类,调用它的雇员。员工都有IPaymentBehaviour ...

public class Employee 
{ 
    IPaymentBehaviour _paymentBehaviour; 

    protected internal Employee() { /* required by NH */} 

    public Employee(IPaymentBehaviour paymentBehaviour) 
    { 
    _paymentBehaviour = paymentBehaviour; 
    } 

} 

这相当于一个数据库表像这样:

dbo.Employees
- >雇员(主键)
- > PaymentBehaviourId(外键查找表)
- >字段1
- >字段2
- >字段3
- >字段4

根据PaymentBehaviourId的值,我需要向Employee对象中注入一个不同的IPaymentBehaviour实现。根据使用哪种PaymentBehaviour,可能需要Field1,2,3或4来创建该行为。

任何人都可以告诉我如何使用Fluent-NHibernate进行映射吗?

+0

对于创建该行为可能需要“Field1,2,3或4”,你是什么意思? “创造”是什么意思?可以更改数据库设计吗? – 2009-05-04 09:32:49

表Employees

  • EMPLOYEEID(主键)
  • PaymentBehaviourId(外键PaymentBehaviour)

表PaymentBehaviour

  • PaymentBehaviourId(PK)
  • 型(鉴别)
  • 字段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> 

NHibernate使用默认的构造函数来实例化实体。虽然有some解决方法。

我想我会解决它是这样的:

  • 创建 Employee对象,具有 private访问修饰符在默认constructur,让NHibernate的可重构这些类型
  • 创建拦截器在你超载的地方适当的方法 (OnLoad我推测),其中你确定 IPaymentBehaviour执行 到实体中。 (也许你可以 创建一个接口 “IPaymentBehaviourInjectable”是 可以通过员工 类实现(实现它可明确),所以 可以注入正确的 行为纳入实体...