我有一个表记录网页点击。类似于:{VisitId,VisitorId,Url,Date} (访客ID是存储在cookie中的GUID)
我想创建一个包含Visit对象集合的Visitor对象。
class Visitor {
public virtual Guid VisitorId { get; set; }
public virtual IList<Visit> Visits { get; set; }
}
NHibernate可以仅从Visits集合中创建此对象,而不是为Visitor添加另一个表吗? 理想情况下,我想写:
var visitor = session.Get<Visitor>(guidFromCookie)
然后能够使用“访问”列表并将更改保留回数据库。
(我正在使用FluentNHibernate和NHibernate 3.0)
我是NHibernate的新手,但似乎应该可以使用自定义的IEntityPersister,或者这个级别太低而且工作量很大?任何建议将不胜感激。
答案 0 :(得分:0)
当您说“创建此对象”时,您的意思是检索?你没有访客桌的原因是什么?如果您不想要访问者实体/表,可以使用criteria API或hbm来加载guid的访问列表。
答案 1 :(得分:0)
如果您映射Visitor
并将其设为Lazy Loaded,则可以执行此操作。你必须告诉NHibernate该表存在,即使它没有。但是,如果要获取Visitor对象(请注意,映射的唯一属性是Id),请使用.Get()
而不是.Load()
,这将返回未初始化的代理。所以你将拥有一个实体,但它实际上不会命中数据库,因此它永远不会知道该表不存在。
public class VisitorMap : ClassMap<Visitor>
{
public VisitorMap()
{
Table("SomeNonExistentTable");
LazyLoad(); // should be the default anyway
Id(x => x.Id)
.GeneratedBy.Guid();
HasMany(x => x.Visits)
.AsList()
.Not.LazyLoad();
}
}
......然后......
var visitor = session.Load<Visitor>(guidFromCookie);
foreach(var visit in visitor.Visits)
{
// do wonderful things
}