コレクションの読み込みに問題があります。私が持っているセットアップは、FluentNHibernateを使用してマッピングされた、単純な1対多の関連付けです。エンティティは例外がスローされることなくロードされますが、関連するコレクションにアクセスすると、「コレクションのロードへの不正なアクセス」が表示されます。ここにコードの関連部分を貼り付けます。
[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];
...
}
セッションを公開することはやるべきことではないことを私は理解していますが、これはセッションが開いていることを確認するための試みでした。
例外をドリルダウンすると、次のスタックトレースが表示されます。
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
プロパティのセッター行にブレークポイントを設定しました。
- それをまたいでクイックウォッチすると
pressJobRunField
、「読み込み例外への不正アクセス」が表示されます。 value
最初に変数をクイックウォッチすると、ロードされたコレクションが表示されます。セッターラインのステップオーバーは期待どおりに機能します。
私が使うもの
- Visual Studio 2012、.NET4を対象
- NHibernate 3.3.1.400
- SQL CE 4
- 城
- CastleAutoTxファシリティ
- WCFリクエストごとに自分でセッションを管理します
私が試したこと
- 遅延読み込みを無効にする
- セッションが開いていること、および問題のあるコードの実行中に同じセッションであることを確認しました
- コレクションの切り替え
Inverted
マップ(反転する必要があると思います) - クリーンアップおよび再構築されたソリューション
- Configuration Managerで、ソリューション内のすべてのプロジェクトがビルドされていることを確認しました
- スローされたすべての例外でブレークするようにデバッガーを設定します。コレクションに設定されていることを除いて、デバッガーは壊れません