使用错误的(棕色地块)数据库模式映射一对一关系

Ted*_*Net 5 nhibernate brownfield nhibernate-mapping

我必须在NHibernate中建模这种关系(简化代码以保持主题) - 员工可以是一个帐户管理员(因此,它是可选的):

表Employee(Id,Number,Name)表EmployeeIsAccountManager(Number,MaxAllowedDiscount)

表EmployeeIsAccountManager指向表Employee,而不是在Employee表中有一个Number列,它指向表EmployeeIsAccountManager中的Number列.

我如何在NHibernate中映射这个?我已经尝试在EmployeeIsAccountManager类映射上使用外部生成器,但如果我使用Number作为外部生成的值,它将映射到Employee的ID,即Id而不是Number.我模仿我的课程使用作文:

public class Employee
{
   public virtual int Id { get; set; }
   public virtual short Number {get; set; }
   public virtual string Name {get; set; }
   public virtual AccountManager AccountManager { get; set; }
}

public class AccountManager
{
  public virtual short Number { get; set; } /*needed because of ID only?*/
  public virtual decimal MaxAllowedDiscount { get; set }
}   
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多(一对一,多对一,外来生成器),但我无法弄清楚是否可以用NHibernate完成.顺便说一下:我可以改变类,映射等但是我不能改变表结构,因为它的棕色区域状态(旧应用程序有200多万行代码,近1000种形式).

任何帮助表示赞赏,谢谢!摊晒

Hog*_*eed 0

你的问题让我思考类继承,你可以将你的类 AccountManager 映射为 Employee 的子类,然后你将能够做你想做的事情,我已经为你测试了一个映射,但是当你设计表时,这种方式不会解决您的需求,因为在映射中您必须注意两点:

  1. Employee 表中的 number 属性应该是 AccountManager 的一种独特的外键,以便用作外键,但即使如此它也不起作用,因为 NHibernate 当您尝试插入新的 Account Manager 时将插入一条记录在人员表中,然后将人员的 id 分配给您需要的 AccountManager 的数字列。
  2. 出于同样的原因,将该关系映射为多对一是行不通的。AccountManager 的 Number 属性是主键吗?是独特的?NHibernate 无法在没有主键的情况下工作,因此为了使该关系正常工作,您必须将 AccountManager 的 Number 属性指定为 Id 列

我想到的最后一个选项是使用 Employee 类中映射到 AccountManager 表的属性,您可以在其中指定自定义选择来获取您需要的值我假设属性 MaxAllowedDiscount,但这也有一些限制,当您使用公式映射属性时,无法插入或更新该属性。

希望这可以帮助我了解是否有疑问。