1

我很难解释,所以我会从一个例子开始。是否可以通过包含名称的列来映射表?

我开始在我的项目中实现对象更改历史记录。 我想跟踪更改日期,更换器,对象更改等,并将该信息保存在我的数据库中。

我设计了一个类似的表(符合我的需求的最):

表更改
CHANGE_ID(PK)| change_date | changer_id(fk)| object_id | table_name | column_name

带有示例性行
120 | 2013-11-20 | 55 | 88 | “发票”| “number”
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;} 
} 

来自发票和员工的ChangesList应来自同一个表中的DB当然。是否可能以及如何通过映射来实现这一点?是否有任何替代品/微小的变化使这成为可能?

+0

林谈论当然NHibernate的(特别是连贯NHibernate)。 – Matek

+0

如果您有任何问题,请添加您当前的地图。 –

+0

不幸的是,我还没有创建任何映射到目前为止,因为我只是不知道该怎么做。 – Matek

回答

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'"); 
+0

非常感谢这个答案!我想我会尝试envers lib,因为它使审计非常简单:) – Matek

相关问题