【问题标题】:NHibernate create object from only collection of childrenNHibernate 仅从子集合创建对象
【发布时间】:2010-10-11 16:01:34
【问题描述】:

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

我想创建一个包含访问对象集合的访问者对象。

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 应该可以实现这一点,还是这太低级并且工作量太大?任何建议将不胜感激。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

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

    【讨论】:

    • 是的,我想从 ISession 中检索对象。
    • 我没有访客表,因为我真的不需要它。它只有一个 Id 列。
    • 如果你想使用“Get”,我认为你需要一张桌子。否则,您将不得不使用某种方式来查询不使用主键的访问表(即 CreateCriteria、hql 等)
    【解决方案2】:

    如果您映射Visitor 并使其延迟加载,您也许可以做到这一点。您必须告诉 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();
        }
    }
    

    ...然后...

    var visitor = session.Load<Visitor>(guidFromCookie);
    foreach(var visit in visitor.Visits)
    {
        // do wonderful things
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      相关资源
      最近更新 更多