首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将一对一关系映射到错误的(棕色)数据库模式

将一对一关系映射到错误的(棕色)数据库模式
EN

Stack Overflow用户
提问于 2010-12-07 19:29:32
回答 2查看 273关注 0票数 5

我必须在NHibernate中对这种关系进行建模(为了紧跟主题,对代码进行了一些简化)--一个员工可以是一个客户经理(所以,这是可选的):

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

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

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

代码语言:javascript
运行
复制
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个表单)。

感谢您的帮助,谢谢!泰德

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-28 22:13:40

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

  1. Employee表中的number属性应该是AccountManager的唯一类型的外键,以便用作外键,但即使这样它也不起作用,因为当您尝试插入新的帐户管理器时,NHibernate会在person表中插入一条记录,然后将person的id分配给您需要中断的AccountManager的number列。由于同样的原因,
  2. 将该关系映射为多对一不起作用。AccountManager的Number属性是主键?是独一无二的?NHibernate不能在没有主键的情况下工作,因此为了使该关系起作用,您必须将AccountManager的数字属性指定为Id列

我脑海中出现的最后一个选项是使用映射到AccountManager表的Employee类中的属性和一个公式,您可以指定一个自定义select来获取所需的值我假定属性为MaxAllowedDiscount,但这也有一些限制,当您使用公式映射属性时,此属性不能插入或更新。

希望这能帮助我知道是否有问题。

票数 0
EN

Stack Overflow用户

发布于 2011-11-26 00:04:39

代码语言:javascript
运行
复制
public class Employee
{
    public virtual short Number
    {
       get { return (AccountManager == null) ? 0 : AccountManager.Number; }
       set
       {
           if (AccountManager == null)
               AccountManager = new AccountManager();
           AccountManager.Number = value;
       }
    }
    public virtual AccountManager AccountManager { get; set; }
}

或使用GeneratedBy.Assinged()

代码语言:javascript
运行
复制
public class Employee
{
    public Employee()
    {
        AccountManager = new AccountManager();
    }

    public virtual AccountManager AccountManager
    {
        get;
        set { value.Parent = this; _accountManager = value; }
    }

    public class AccountManager
    {
        Internal protected virtual Employee Parent { get; set; } 

        protected virtual short Number { get { return Parent.Number; } set { } } /*needed because of ID only?*/
        public virtual decimal MaxAllowedDiscount { get; set }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4376113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档