我在数据库中有一个日志表,没有任何可用作唯一键,既不是单个键也不是复合键。这是一个简单的转储表,如:
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进行实现时会忽略它。
有这种方法的经验吗?它可以用于此目的吗? (并不是说我支持无密钥表/实体,但有时我必须使用我得到的东西......)
答案 0 :(得分:0)
使用查询和AliasToBeanTransformer
处理此数据。如果此类的映射存在与否并不重要,并且因为没有键而无法进行映射,则可以抛弃映射。