nhibernate查询Compositeid异常

布鲁斯·麦奎尔

我在看起来很简单的QueryOver上遇到错误。复杂的是选择涉及一个CompositeId。

我得到的错误是:

System.InvalidOperationException:类型为'nha.cs.utility.mole.QueryParameters'的变量'x'从范围”引用,但未定义。

我正在映射具有许多查询参数的查询。组合ID包含查询和查询参数名称,如下所示。

public class Query
{
    public virtual int id { get; protected set; }
    public virtual string name { get; set; }
    public virtual string query { get; set; }
    public virtual IList<QueryParameters> parameters { get; set; }
    public virtual IList<Application> applicationsUsedIn { get; set; }

    public Query()
    {
        this.parameters = new List<QueryParameters>();
        this.applicationsUsedIn = new List<Application>();
    }

    public virtual void AddParameter(QueryParameters qp)
    {
        qp.query = this;
        this.parameters.Add(qp);
    }
}


public class QueryParameters
{
    public virtual Query query { get; set; }
    public virtual string name { get; set; }
    public virtual string type { get; set; }
    public virtual int order { get; set; }

    public QueryParameters()
    {
    }

    public QueryParameters(Query qry, string nm)
    {
        this.query = qry;
        this.name = nm;
    }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        var t = obj as QueryParameters;
        if (t == null)
            return false;
        if (query == t.query && name == t.name)
            return true;
        return false;
    }
    public override int GetHashCode()
    {
        return (query.id + "|" + name)).GetHashCode();
    }
}


    public QueryMap()
    {
        Table("dbo.Queries");
        Id(x => x.id);
        Map(x => x.name);
        Map(x => x.query);
        HasMany(x => x.parameters)
            .Cascade.All()
            ;
        HasManyToMany(x => x.applicationsUsedIn)
            .Table("dbo.ApplicationsQueries")
            .ParentKeyColumn("qryid")
            .ChildKeyColumn("appid")
            .Inverse()
            .LazyLoad();
    }


    public QueryParametersMap()
    {
        Table("dbo.QueryParameters");
        CompositeId()
            .KeyReference(x => x.query)
            .KeyProperty(x => x.name)
            ;
        References(x => x.query).Column("qryid").Not.Insert();
        Map(x => x.name);
        Map(x => x.order);
        Map(x => x.type);
    }


    public Query addParameterToQuery(Query qry, string paramname, string paramtype, int paramorder)
    {
        if (null != qry)
        {
            string qryname = qry.name;
            string qrystr = qry.query;

            using (ISessionFactory isf = getSessionFactory())
            {
                using (var sess = isf.OpenSession())
                {
                    using (var tran = sess.Transaction)
                    {
                        try
                        {
                            tran.Begin();

                            var critqry = sess.CreateCriteria<Query>()
                                .Add(Restrictions.Eq("name", qryname));

                            Query qryd = (Query)critqry.UniqueResult();

                            if (null == qryd)
                            {
                                qryd = new Query();
                                qryd.name = qryname;
                                qryd.query = qrystr;
                                sess.Save(qryd);

                                Console.Out.WriteLine("Query was null, added new query with name '" + qryname + "'");
                            }
                            else
                            {
                                Console.Out.WriteLine("Query was not null, has name '" + qryname + "'");
                            }

                            //EXCEPTION THROWN ON THIS LINE BELOW
                            var cp = sess.QueryOver<QueryParameters>()
                                .Select(x => x.query == qryd, x => x.name == paramname);

                            QueryParameters qryparam = cp.List().First<QueryParameters>();

                        }
                        catch (Exception ex)
                        {
                            tran.Rollback();
                            lws.logMessage(AppName, "addParameterToQuery", ex.ToString(), MessageType.Info, MessageLevel.Error);
                            Console.Out.WriteLine(ex.ToString());
                        }
                    }
                }
            }
        }

        return (null);
    }

任何想法或指针将不胜感激。

谢谢,

布鲁斯。

更新的代码

public class QueryMap : ClassMap<Query>
{
    public QueryMap()
    {
        Table("dbo.Queries");
        Id(x => x.id);
        Map(x => x.name);
        Map(x => x.query);
        HasMany(x => x.parameters)
            .Cascade.All()
            .KeyColumn("qryid");
        HasManyToMany(x => x.applicationsUsedIn)
            .Table("dbo.ApplicationsQueries")
            .ParentKeyColumn("qryid")
            .ChildKeyColumn("appid")
            .Inverse()
            .LazyLoad();
    }
}


public class QueryParametersMap : ClassMap<QueryParameters>
{
    public QueryParametersMap()
    {
        Table("dbo.QueryParameters");
        Id(x => x.id);
        References(x => x.query).Column("qryid").Not.Insert();
        Map(x => x.name);
        Map(x => x.type);
        Map(x => x.order).Column("ordr");
    }
}


    var cp = sess.QueryOver<QueryParameters>()
        .Where(x => x.query.id == qryd.id)
        .And(x => x.name == paramname);
拉迪姆·科勒

一个问题是使用.Select()as作为过滤部分。使用时,QueryOver我们必须使用.Where()

var cp = sess.QueryOver<QueryParameters>()
    //.Select(x => x.query == qryd, x => x.name == paramname)
    .Where(x => x.query.Id == qryd.ID)
    .And(x => x.name == paramname)
    .List<QueryParameters>();

16.2。简单表达式.Select()可缩小结果集,因为它的定义将被用于SELECT子句创建:16.6。投影

为了在查询中包含更多相关的对象/实体,我们可以使用16.4。关联(即JOIN相关表)

注意:布鲁斯,如果可能的话,我将尝试重新考虑域模型。多对多和复合ID表示某些事物过于复杂(如果不是过于复杂)在阻止人们使用异国情调的映射之前,我尝试了很多次……它是为遗留目的而存在的。也许检查以下部分:24.最佳实践

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NHibernate / FluentNHibernate只读CompositeId

来自分类Dev

如何使用Fluent NHibernate映射CompositeId的引用

来自分类Dev

如何使用NHibernate在CompositeId映射中设置列

来自分类Dev

带有自定义类型映射的 NHibernate Fluent CompositeId

来自分类Dev

向NHibernate查询中添加多个ORDER BY子句会引发异常

来自分类Dev

使用NHibernate的多查询功能时遇到“未定义别名或未知映射”异常

来自分类Dev

NHibernate嵌套列表查询

来自分类Dev

NHibernate嵌套列表查询

来自分类Dev

视图异常之后的Nhibernate延迟加载异常

来自分类Dev

流利的NHibernate会话异常处理

来自分类Dev

NHibernate-错误的查询列

来自分类Dev

NHibernate与WHERE条件成对查询

来自分类Dev

更改集合后的NHibernate查询

来自分类Dev

Nhibernate / Linq查询非常慢

来自分类Dev

NHibernate QueryOver从基础查询子类

来自分类Dev

更改集合后的Nhibernate查询

来自分类Dev

在NHibernate实体中执行查询

来自分类Dev

NHibernate ToList(),然后查询导致多个查询

来自分类Dev

Nhibernate查询超时而SQL查询不

来自分类Dev

NHibernate LINQ Where和任何抛出异常

来自分类Dev

NHibernate异常破坏其他进程

来自分类Dev

NHibernate“集合映射中的重复列”异常

来自分类Dev

NHibernate抛出“无法解析属性”异常

来自分类Dev

NHibernate“在集合映射中重复的列”异常

来自分类Dev

NHibernate Composite-ID子级联异常

来自分类Dev

nhibernate无法确定实体异常的类型

来自分类Dev

MongoDB查询异常缓慢

来自分类Dev

sqlite查询android异常

来自分类Dev

sql查询异常