我必须在NHibernate中对这种关系进行建模(为了紧跟主题,对代码进行了一些简化)--一个员工可以是一个客户经理(所以,这是可选的):
表Employee (Id,Number,Name)表EmployeeIsAccountManager (Number,MaxAllowedDiscount)
我在Employee表中有一个Number列,它指向表EmployeeIsAccountManager中的Number列,而不是在表EmployeeIsAccountManager中有一个指向Employee表的Id外键。
如何在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 }
}
我尝试了很多(一对一,多对一,外国生成器),但我不知道这是否可以用NHibernate完成。顺便说一句:我可以更改类、映射等,但我不能更改表结构,因为它的棕色区域状态(旧应用程序有几百万行2+代码,将近1000个表单)。
感谢您的帮助,谢谢!泰德
发布于 2011-02-28 22:13:40
你的问题让我想到了类继承,你可以将你的类AccountManager映射为Employee的子类,然后你就可以做你想做的事情了,我已经为你测试了一个映射,但由于你以这种方式设计表并不能解决你的需求,因为在你的映射中有两点你必须注意:
我脑海中出现的最后一个选项是使用映射到AccountManager表的Employee类中的属性和一个公式,您可以指定一个自定义select来获取所需的值我假定属性为MaxAllowedDiscount,但这也有一些限制,当您使用公式映射属性时,此属性不能插入或更新。
希望这能帮助我知道是否有问题。
发布于 2011-11-26 00:04:39
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()
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 }
}
}
https://stackoverflow.com/questions/4376113
复制相似问题