Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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
C# 如何查询多对多关系的审计表_C#_Nhibernate_Nhibernate Envers - Fatal编程技术网

C# 如何查询多对多关系的审计表

C# 如何查询多对多关系的审计表,c#,nhibernate,nhibernate-envers,C#,Nhibernate,Nhibernate Envers,我有一个entry类,它与tags类有多对多的关系。我正在尝试还原一个条目的历史副本 我尝试过这样的查询: AuditReader reader = AuditReaderFactory.get(getEm()); var entryRevision = reader.createQuery() .ForEntitiesAtRevision(typeof(IEntry), false, true) .Add(new IdentifierEqAuditExpression(entr

我有一个entry类,它与tags类有多对多的关系。我正在尝试还原一个条目的历史副本

我尝试过这样的查询:

AuditReader reader = AuditReaderFactory.get(getEm());
var entryRevision = reader.createQuery()
    .ForEntitiesAtRevision(typeof(IEntry), false, true)
    .Add(new IdentifierEqAuditExpression(entryId, true))
    .Add(AuditEntity.RevisionNumber().Eq(revisionNumber)))
    .GetResultList().SingleOrDefault();
但是,在尝试访问Tags属性或entryRevision时,我遇到一个错误:

NHibernate.LazyInitializationException:初始化[Unavailable]-未能延迟初始化集合,未关闭任何会话或会话

我已确认,当我尝试访问标签时,会话仍处于打开状态


我想通过直接查询Tag\u Entry\u AUD表来解决这个问题,以获得所有可能曾经与此项关联的Tag id,但我不确定如何操作?有可能通过HQL查询实现这一点吗?

我能够得到一些有用的东西:

const string hql = "from Tag_Entry_AUD tc";
var associatedTagIds = reader.CreateQuery(hql).List<Hashtable>()
    .Select(t => t["originalId"] as Hashtable)
    .Where(tc => (Guid) tc["Entry_Id"] == entryId && ((RevisionHistory)tc["REV"]).RevisionNumber <= revisionNumber)
    .Select(tc => (Guid) tc["Tags_Id"])
    .ToList();
这将提供一个标记ID列表,这些标记在某个点上与条目关联

编辑:

正如Roger指出的,上面的代码作为一个HQL查询将加载整个Tag_entry_AUD表。。。可能需要避免的是:

const string hql = "SELECT originalId.Tags_Id " +
    "FROM Tag_Entry_AUD te " +
    "WHERE te.originalId.Entry_Id = :id " +
    "AND te.originalId.REV = :revNo";

SimpleQuery<Guid> q = new SimpleQuery<Guid>(hql);
q.SetParameter("id", entryId);
q.SetParameter("revNo", revisionNumber);
var associatedTagIds = q.Execute().ToList();

请确认会话再次仍然处于打开状态;。这是一个NH核心异常,而不是envers异常……它将加载tag_entry_aud表中的每一行。