gpt4 book ai didi

NHibernate 集合加载, "illegal access to loading collection"

转载 作者:行者123 更新时间:2023-12-04 12:42:18 24 4
gpt4 key购买 nike

我在加载集合时遇到问题。我的设置是简单的一对多关联,使用 FluentNHibernate 映射。实体加载时抛出了大量异常,但访问相关集合显示“非法访问加载集合”。我将在此处粘贴代码的相关部分。

[Serializable]
[DataContract(IsReference = true)]
public partial class Department : Entity
{
...
[DataMember]
public virtual IList<PressJobRun> PressJobRun
{
get { return pressJobRunField; }
protected set { pressJobRunField = value; }
}
...
}

映射如下
public DepartmentMap()
{
Id(x => x.Id);
Map(x => x.Name)
.Not.Nullable()
.Length(100);
HasMany(x => x.PressJobRun)
.AsBag()
.Inverse()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.BatchSize(50);
...
}

我还尝试通过排除该行并调用 .Not.LazyLoad() 来禁用延迟加载。 ,然而结局是一样的。
    using (var tx = m_Repository.Session.BeginTransaction())
{
var depts = m_Repository.Session.CreateCriteria<Department>().List<Department>();
var dept = depts[0];
...
}

我意识到暴露 Session 不是要做的事情,但这是为了确保该 session 是打开的。

当我深入研究异常时,我看到以下堆栈跟踪:
   at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing)
at NHibernate.Collection.AbstractPersistentCollection.Read()
at NHibernate.Collection.AbstractPersistentCollection.ReadSize()
at NHibernate.Collection.PersistentBag.get_Count()
at NHibernate.DebugHelpers.CollectionProxy`1.get_Items()

有趣的小鬼来了。我在 PressJobRun 的 setter 行上设置了断点属性(property)。
  • 如果我跨过它并快速观看 pressJobRunField ,我看到了“非法访问加载异常”。
  • 如果我先快速观看 value变量,我看到加载的集合。跨过 setter 线按预期工作。


  • 我用什么
  • Visual Studio 2012,面向 .NET 4
  • NHibernate 3.3.1.400
  • SQL CE 4
  • 城堡
  • CaSTLe AutoTx 设施
  • 我自己管理每个 WCF 请求的 session


  • 我试过的
  • 禁用延迟加载
  • 确保 session 是打开的,并且在执行违规代码期间是同一个 session
  • 切换 Inverted收藏图(我觉得应该倒过来)
  • 清洁和重建解决方案
  • 确保在 Configuration Manager 中解决方案中的所有项目都正在构建
  • 将调试器设置为中断所有抛出的异常。调试器不会因为我看到集合中设置的异常而中断
  • 最佳答案

    问题是当 PressJobRub.Department属性已设置,我的代码还添加了 PressJobRunDepartment 中的适当集合.我确实初始化了集合,但问题是 NHibernate 使用的集合在调用 Contains() 时由于某种原因失败了。方法。我仍然想知道我在问题中描述的 gremlin,以及为什么当我取消选中“仅启用我的代码调试”并将其设置为在抛出异常时也中断时调试器没有因异常而中断。

    无论如何,解决方案是映射PressJobRun.Department访问字段(在我的情况下是 Access.PascalCaseField(Prefix.mUnderscore) )以避免调用将实体添加到 Department.PressJobRun收藏。

    Krzysztof Kozmic's article解释了这一点,尽管在我的情况下,集合并非未初始化。

    关于NHibernate 集合加载, "illegal access to loading collection",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757870/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com