当两个子类都可以实现时,nhibernate子类映射

时间:2010-12-20 22:04:06

标签: c# nhibernate orm fluent-nhibernate

我有以下课程

public class Person 
{
     public virtual int Id { get; set; }
}
public class Employee : Person
{
     public virtual int EmployeeProperty { get; set; }
}
public class Customer : Person
{
     public virtual int CustomerProperty { get; set; }
}

从概念上讲,同一个人既可以是员工,也可以是客户。此外,Person可以在没有Employee或Customer记录的情况下存在。使用Table Per Subclass如何使其工作。

现在看来,我没有办法让NHibernate以这种方式工作。如果我创建一个Person,然后尝试使用现有的Person Id创建一个Employee,NHibernate仍然会尝试插入Person。有没有办法让NHibernate意识到我已经有了一个Person而只想添加Employee记录?

如果可能的话,我宁愿不去Table Per Class或Table Per Hierarchy。

2 个答案:

答案 0 :(得分:3)

你的模特不正确。如果一个人可以 一个客户和一个员工,那么你不应该使用继承(一个员工是一个人),但是组合(一个员工有一个[相应的]人或一个人有 - 员工[角色])

答案 1 :(得分:0)

这在OO的实践中不起作用。您可能希望遵循一条路线,该路线表明某人具有作为客户的角色,并且还具有成为员工的角色。

这是一个简单的例子,说明为什么这不能用于一般的OO术语。

Person a = new Employee();
Customer b = (Customer)a; // exception