地图使用功能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进行映射吗?
答
表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>
答
我想我会解决它是这样的:
- 创建 Employee对象,具有
private
访问修饰符在默认constructur,让NHibernate的可重构这些类型 - 创建拦截器在你超载的地方适当的方法 (OnLoad我推测),其中你确定
IPaymentBehaviour
执行 到实体中。 (也许你可以 创建一个接口 “IPaymentBehaviourInjectable”是 可以通过员工 类实现(实现它可明确),所以 可以注入正确的 行为纳入实体...
对于创建该行为可能需要“Field1,2,3或4”,你是什么意思? “创造”是什么意思?可以更改数据库设计吗? – 2009-05-04 09:32:49