我很难解释,所以我将从一个例子开始。
我正在开始在我的项目中实现一个更改历史记录的对象。 我想跟踪更改日期,更换器,更改的对象等,并在我的数据库中保留该信息。
我设计了一个类似于此的表格(最符合我的需求):
表格变化
change_id(pk)| change_date | changer_id(fk)| object_id | table_name |列名
具有示例性行
120 | 2013-11-20 | 55 | 88 | “发票”| “数字”
121 | 2013-11-25 | 53 | 99 | “员工”| “名称”
现在,我想拥有这种实体对象:
class Employee
{
public virtual string Name {get; set;}
public virtual IList<Changes> ChangesList {get; set;}
}
class Invoice
{
public virtual string Number {get; set;}
public virtual IList<Changes> ChangesList {get; set;}
}
Invoice和Employee中的ChangesList当然应该来自DB中的同一个表。是否有可能以及如何通过映射实现这一目标?是否有任何替代方案/细微变化可以实现这一目标?
答案 0 :(得分:2)
在您自己创建之前,请先查看处理审核的NHibernate.Envers。
如果它不符合您的需求,可以将其映射为
public ChangeMap
{
Id(x => x.Id);
Map(x => x.Date, "change_date");
References(x => x.Changer, "changer_id");
...
Map(x => x.TableName, "table_name");
}
// in EmployeeMap
HasMany(x => x.ChangesList).Where("table_name = 'employees'");
// in InvoiceMap
HasMany(x => x.ChangesList).Where("table_name = 'invoices'");