Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 有时候我想要一件,有时候我想要所有的_Nhibernate - Fatal编程技术网

Nhibernate 有时候我想要一件,有时候我想要所有的

Nhibernate 有时候我想要一件,有时候我想要所有的,nhibernate,Nhibernate,我有一个数据库模式,它存储一个包含许多“修订”的“页面”。就像一个简单的维基 90%的时候,当我加载页面时,我只是对最新版本感兴趣。然而,有时我需要所有的修改 使用NHibernate,我可以将页面映射到修订,并告诉它延迟加载。但是,当我访问最新版本时,它将加载所有其他版本-这是对I/O的巨大浪费 我的页面类当前类似于: public class Page { public Page() { Revisions = new HashedSet<Revisio

我有一个数据库模式,它存储一个包含许多“修订”的“页面”。就像一个简单的维基

90%的时候,当我加载页面时,我只是对最新版本感兴趣。然而,有时我需要所有的修改

使用NHibernate,我可以将页面映射到修订,并告诉它延迟加载。但是,当我访问最新版本时,它将加载所有其他版本-这是对I/O的巨大浪费

我的页面类当前类似于:

public class Page
{
    public Page()
    {
        Revisions = new HashedSet<Revision>();
    }

    public virtual ISet<Revision> Revisions { get; private set; }

    public virtual Revision LatestRevision
    {
        get { return Revisions.OrderByDescending(x => x.Revised).FirstOrDefault(); }
    }

    public virtual Revision Revise()
    {
        var revision = new Revision();
        // ...
        revision.Entry = this;
        revision.Revised = DateTime.UtcNow;
        Revisions.Add(revision);
        return revision;
    }
}
公共类页面
{
公共网页()
{
修订=新的HashedSet();
}
公共虚拟ISet修订版{get;private set;}
公共虚拟视野
{
获取{return Revisions.OrderByDescending(x=>x.revisited).FirstOrDefault();}
}
公共虚拟修订版
{
var修订=新修订();
// ...
修订。条目=本;
revision.reviside=DateTime.UtcNow;
修订。添加(修订);
返回修订;
}
}
我将如何对此进行建模,以便在加载页面时自动加载LatestRevision,但如果(例如)我尝试迭代其他修订,则会延迟加载它们


我特别想要一个能与LINQ到NHibernate一起工作的解决方案,但使用ICriteria(如果必须的话,甚至SQL)已经足够了。

我也在解决类似的问题

那么,如何准确地映射您在那里的位置呢。LatestRevision属性可以作为一对一映射映射到修订表,并且修订将与您已经获得的一样。您必须有一个setter(可能是私有的)并在review方法中管理关系

一个问题是,最新的愿景仍将在修订集中


我还遇到过一篇文章,其中使用了属性的formula属性,我从未使用过它,但看起来它可能符合要求。

您可以在映射文件中使用派生属性(而不是在属性中执行逻辑)。它可能看起来像这样:

<property name="LatestRevision"
          forumla="select top r.f1, r.f2, r.etc from Revisions order by revised desc"
          type="Revision" />

有关此方法的更多信息,请搜索“nhibernate派生属性”


添加一个LatestRevision列(维护它)并映射到该列。
这会帮你省去很多麻烦。

我最后想到了以下解决方案:

我的页面现在具有以下属性:

public virtual Revision CurrentRevision 
{ 
    get
    {
        return _revision ?? Revisions.OrderByDescending(x => x.Revised).FirstOrDefault();
    }
    set { _revision = value; }
}

public virtual ISet<Revision> Revisions { get; private set; }

页表中有LatestRevision属性和相应列有什么问题

public class Page
{
    public Page()
    {
        Revisions = new HashedSet<Revision>();
    }

    public virtual ISet<Revision> Revisions { get; private set; } // lazy="true"

    public virtual Revision LatestRevision { get; private set; } // lazy="false"

    public virtual Revision Revise()
    {
        var revision = new Revision();
        // ...
        revision.Entry = this;
        revision.Revised = DateTime.UtcNow;
        Revisions.Add(revision);
        LatestRevision = revision; // <- there you have latest revision
        return revision;
    }
}
公共类页面
{
公共网页()
{
修订=新的HashedSet();
}
公共虚拟ISet修订版{get;private set;}//lazy=“true”
公共虚拟版本LatestRevision{get;private set;}//lazy=“false”
公共虚拟修订版
{
var修订=新修订();
// ...
修订。条目=本;
revision.reviside=DateTime.UtcNow;
修订。添加(修订);

LatestRevision=revision;//嗯,我喜欢这个解决方案,因为它允许我只进行内部联接,而不必选择max orderby等。这样做的一个问题是页面取决于修订,修订将取决于页面-这意味着我需要至少一个列为null,并使用两个事务使其工作:(我刚刚尝试了这个方法,但似乎只有当公式返回简单类型时,我才能使用它。对于我复杂的修订对象,我需要为它编写一个IUserType-这将使我走上调用数据读取器的道路,而这似乎违背了使用NH的目的:)很高兴知道。我不知道它只限于简单的类型。就像Freddy的回答一样-除非有修订,否则你不能创建页面,但是没有页面,你就不能有修订。除非你将latestrevision设置为null,这对我来说似乎是错误的。对不起,可能太晚了。也许你应该在创建页面时创建第一个修订预计起飞时间?
SELECT   top 1 this_.Id            as Id3_1_,
               this_.Name          as Name3_1_,
               this_.Title         as Title3_1_,
               rev1_.Id            as Id0_0_,
               rev1_.Body          as Body0_0_,
               rev1_.Revised       as Revised0_0_,
               ....
FROM     [Page] this_
         inner join [Revision] rev1_
           on this_.Id = rev1_.PageId
WHERE    this_.Name = 'foo' /* @p0 */
ORDER BY rev1_.Revised desc
public class Page
{
    public Page()
    {
        Revisions = new HashedSet<Revision>();
    }

    public virtual ISet<Revision> Revisions { get; private set; } // lazy="true"

    public virtual Revision LatestRevision { get; private set; } // lazy="false"

    public virtual Revision Revise()
    {
        var revision = new Revision();
        // ...
        revision.Entry = this;
        revision.Revised = DateTime.UtcNow;
        Revisions.Add(revision);
        LatestRevision = revision; // <- there you have latest revision
        return revision;
    }
}