gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:59:35 24 4
gpt4 key购买 nike

我必须在 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com