NHibernate仅从子集合中创建对象

时间:2010-10-11 16:01:35

标签: nhibernate

我有一个表记录网页点击。类似于:{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,或者这个级别太低而且工作量很大?任何建议将不胜感激。

2 个答案:

答案 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
}