nhibernate - 将一对一关系映射到错误的(棕地)数据库模式

标签 nhibernate nhibernate-mapping brownfield

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

员工表(ID、号码、姓名)
表 EmployeeIsAccountManager (Number, MaxAllowedDiscount)

我没有在 EmployeeIsAccountManager 表中有一个 Id 外键指向 Employee 表,而是在 Employee 表中有一个 Number 列,它指向 EmployeeIsAccountManager 表中的 Number 列。

我如何在 NHibernate 中映射它?我已经尝试在 EmployeeIsAccountManager 类映射上使用外部生成器,但是如果我使用 Number 作为外部生成值,它会映射到 Employee 的 ID,即 Id 而不是 Number。我为我的类(class)建模以使用组合:

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 }
}   

我已经尝试了很多(一对一、多对一、外国生成器),但我不知道这是否可以用 NHibernate 来完成。顺便说一句:我可以更改类、映射等,但我无法更改表结构,因为它处于棕地状态(旧应用程序有 2 多万行代码,近 1000 个表单)。

任何帮助表示赞赏,谢谢!
泰德

最佳答案

你的问题让我想到了类继承,你可以将你的类 AccountManager 映射为 Employee 的子类,然后你就可以做你想做的事情,我已经为你测试了一个映射,但因为你设计的表格没有解决您的需求,因为您必须在映射中注意两点:

  • Employee 表中的 number 属性应该是 AccountManager 的唯一类型的前键,以便用作外键,但即使如此它也不起作用,因为 NHibernate,当您尝试插入新的 Account Manager 时将插入一条记录在 person 表中,然后将 person 的 id 分配给您需要的 AccountManager 的 number 列。
  • 出于同样的原因,将该关系映射为多对一并不适用。 AccountManager 的 Number 属性是主键吗?是独特的? NHibernate 不能在没有主键的情况下工作,因此为了使这种关系起作用,您必须将 AccountManager 的 Number 属性指定为 Id 列

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

    希望这可以帮助
    如果有问题,请告诉我。

    关于nhibernate - 将一对一关系映射到错误的(棕地)数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4376113/

    相关文章:

    .net - 使用 NHibernate 进行查询

    NHibernate 使用 Linq 或 QueryOver 将子实体投影到父属性中

    sql-server - NHibernate 加入子类

    NHibernate:为什么要在<一对多>上使用<composite-element>来映射集合

    unit-testing - 考虑到增强和重构业务关键应用程序的任务,对开发人员有什么建议吗?

    silverlight - 了解 WCF 的工作原理

    nhibernate - 获取无数据库访问权限的惰性多对一对象的 ID

    nhibernate映射: A collection with cascade ="all-delete-orphan" was no longer referenced

    ruby-on-rails - 考虑使用现有数据(不是数据库,实际数据)的新 Rails 应用程序——最好的处理方法是什么?

    asp.net - 棕地 ASP.NET 应用程序的有用/现实的代码覆盖率目标