2010-10-11 47 views
1

我有一个表记录网页点击。类似于:{VisitId,VisitorId,Url,Date} (访客ID是存储在cookie中的GUID)NHibernate从只有儿童的集合创建对象

我想创建一个Visitor对象,该对象具有一个Visit对象集合。

class Visitor { 
    public virtual Guid VisitorId { get; set; } 
    public virtual IList<Visit> Visits { get; set; } 
} 

与其为Visitor添加另一个表,NHibernate是否可以仅从Visits集合创建此对象? 理想情况下,我想这样写:

var visitor = session.Get<Visitor>(guidFromCookie) 

,然后可以与访问列表来工作,坚持更改回DB。

(我使用FluentNHibernate和NHibernate 3.0)

我是新来的NHibernate,但似乎事情应该可以使用自定义IEntityPersister,或者是这个等级太低和工作负荷?任何建议,将不胜感激。

回答

0

当你说“创建这个对象”,你的意思是检索?没有访客表的原因是什么?如果您不想访问实体/表,您可以使用criteria API或hbm加载guid的访问列表。

+0

是的,我想在检索的Isession的对象。 – 2010-10-11 16:49:08

+0

我没有Visitor表,因为我真的不需要它。它只会有一个Id列。 – 2010-10-11 16:50:25

+0

我想你会需要一个表,如果你想使用“获取”。否则,您将不得不使用某种方式来查询不使用主键的Visit表(即CreateCriteria,hql等) – 2010-10-11 17:45:14

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 
}