【问题标题】:How to restrict selection with QueryOver in (fluent) nhibernate?如何在(流利的)nhibernate中使用QueryOver限制选择?
【发布时间】:2011-04-11 09:25:31
【问题描述】:

我想通过来自另一个对象的属性过滤数据库中的对象,但我得到一个异常:

“System.Collections.Generic.KeyNotFoundException”类型的第一次机会异常发生在 mscorlib.dll
NHibernate.dll 中发生了“NHibernate.QueryException”类型的第一次机会异常
NHibernate.dll 中发生了“NHibernate.QueryException”类型的第一次机会异常
程序“[5116] Examples.FirstProject.vshost.exe: Managed (v2.0.50727)”已退出,代码为 -532459699 (0xe0434f4d)。

这行得通:

var curves = session.QueryOver<Curve>().WhereRestrictionOn(p => p.Name).IsLike("%CurveName%").List();
foreach (Curve curve in curves)
{
    Console.WriteLine(" ID:\t{0}\n Name:\t{1}\n Group:\t{2}\n", curve.Id, curve.Name, curve.Group.Name);
}

这不是,它输出异常信息:

var curves = session.QueryOver<Curve>().WhereRestrictionOn(p => p.Group.Name).IsLike("%GroupName%").List();
foreach (Curve curve in curves)
{
    Console.WriteLine(" ID:\t{0}\n Name:\t{1}\n Group:\t{2}\n", curve.Id, curve.Name, curve.Group.Name);
}

这些是我的映射:

public class CurveMap : ClassMap<Curve>
{
    public CurveMap()
    {
        Table("CURVES");
        Id(x => x.Id).Column("CURVE_ID");
        Map(x => x.Name).Column("NAME");
        References(x => x.Group).Column("GROUP_ID");
    }
}

public class CurveGroupMap : ClassMap<CurveGroup>
{
    public CurveGroupMap()
    {
        Table("GROUPS");
        Id(x => x.Id).Column("GROUP_ID");
        Map(x => x.Name).Column("NAME");
        HasMany(x => x.Curves).KeyColumn("GROUP_ID").Cascade.All().Inverse();
    }
}

这些是我的对象

public class Curve
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual CurveGroup Group { get; set; }
}

public class CurveGroup
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual IList<Curve> Curves { get; set; }
}

任何想法,如何解决这个问题。我是(流利的)nhibernate 的新手。

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-mapping queryover


    【解决方案1】:

    如果您加入 CurveGroup 并使用 Aliases,它将起作用:

    CurveGroup cgAlias = null;
    var curves = session.QueryOver<Curve>()
        .JoinAlias(e => e.Group, () => cgAlias)
        .WhereRestrictionOn(() => cgAlias.Name).IsLike("%GroupName%").List();
    

    【讨论】:

    • 有效,但似乎很复杂。有没有更简单的方法来实现这一点,或者为什么必须这样。您能否详细说明您的答案并提供更多详细信息。
    • @mrt181 QueryOver 似乎在设计上不会自行导航关联路径。您必须在查询中明确指定。如果未指定关联路径,则会引发异常“无法解析属性”。 (有关JoinAliasJoinQueryOver 的更多详细信息,请参阅here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多