NHibernate仅从子对象集合创建对象

NHibernate仅从子对象集合创建对象,nhibernate,Nhibernate,我有一个记录网页点击率的表格。类似于:{VisitId,VisitorId,Url,Date} (访客ID是存储在cookie中的GUID) 我想创建一个具有访问对象集合的访问者对象 class Visitor { public virtual Guid VisitorId { get; set; } public virtual IList<Visit> Visits { get; set; } } 类访问者{ 公共虚拟Guid访问ID{get;set;} 公共虚拟ILi

我有一个记录网页点击率的表格。类似于:{VisitId,VisitorId,Url,Date} (访客ID是存储在cookie中的GUID)

我想创建一个具有访问对象集合的访问者对象

class Visitor {
  public virtual Guid VisitorId { get; set; }
  public virtual IList<Visit> Visits { get; set; }
}
类访问者{
公共虚拟Guid访问ID{get;set;}
公共虚拟IList访问{get;set;}
}
NHibernate是否可以仅从访问集合创建此对象,而不是为访问者添加另一个表? 理想情况下,我想写:

var visitor = session.Get<Visitor>(guidFromCookie)
var visitor=session.Get(guidFromCookie)
然后能够使用访问列表并将更改保留回数据库

(我正在使用FluentNHibernate和NHibernate 3.0)


我是NHibernate的新手,但似乎应该可以使用定制的IEntityPersister,或者这是不是太低的级别和工作量?如果您有任何建议,我们将不胜感激。

当您说“创建此对象”时,是指检索吗?您没有访客表的原因是什么?如果不需要访问者实体/表,可以使用或hbm按guid加载访问列表。

如果映射
访问者并使其延迟加载,则可以执行此操作。你必须告诉NHibernate这张桌子存在,即使它不存在。但是,如果要获取访问者对象(请注意,唯一映射的属性是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();
    }
}
公共类访问映射:类映射
{
公众访问AP()
{
表(“一些不存在的表”);
LazyLoad();//无论如何都应该是默认值
Id(x=>x.Id)
.GeneratedBy.Guid();
有很多(x=>x.visions)
.AsList()
.Not.LazyLoad();
}
}
……然后

var visitor = session.Load<Visitor>(guidFromCookie);
foreach(var visit in visitor.Visits)
{
    // do wonderful things
}
var visitor=session.Load(guidFromCookie);
foreach(访客访问中的var访问)
{
//做精彩的事情
}

是的,我想从ISession中检索对象。我没有访问者表,因为我真的不需要它。它只有一个Id列。我想如果你想使用“Get”,你需要一个表。否则,您必须使用某种方式查询不使用主键的访问表(即CreateCriteria、hql等)