NHibernate:使用AliasToBeanTransformer记录表的无密钥实体类 - 好吗?

时间:2014-01-07 16:50:24

标签: nhibernate logging mapping entity primary-key

我在数据库中有一个日志表,没有任何可用作唯一键,既不是单个键也不是复合键。这是一个简单的转储表,如:

CREATE TABLE Logging
(
    Timestamp DateTime not null,
    AffectedItemID int not null,
    KindOfItem int not null, -- enum-like
    KindOfEvent int not null, -- enum-like
    UserName nvarchar(128) null,
    MoreDetails nvarchar(max) null
)

将此映射到NHibernate中的持久化类导致严重问题,因为需要密钥,但不存在任何密钥;复合列(没有MoreDetail)不是唯一的。我首先尝试使用复合键(除了MoreDetails之外的所有列)。如果复合键重复,则会丢失查询中返回的行,如果一个或多个键列具有NULL值(此处仅为UserName),则会发生另一个问题 - 我在结果列表中重复获取null元素(使用NHibernate Criteria, with .List< LoggingEntryClass>())。

没有机会添加主键,已经使用该表的代码太多了。日志条目中也没有子集合或引用。

因此,由于没有直接对象查询(Criteria,HQL或其他)可以正确使用,我尝试使用别名和AliasToBeanTransformer进行投影。这似乎给出了正确的结果,但我不确定它是否绕过NHibernate会话身份/密钥检查。我还将会话类型从正常更改为无状态。

实体类仍然具有旧的NHibernate映射和非唯一复合键;我希望在使用AliasToBeanTransformer进行实现时会忽略它。

有这种方法的经验吗?它可以用于此目的吗? (并不是说我支持无密钥表/实体,但有时我必须使用我得到的东西......)

1 个答案:

答案 0 :(得分:0)

使用查询和AliasToBeanTransformer处理此数据。如果此类的映射存在与否并不重要,并且因为没有键而无法进行映射,则可以抛弃映射。