7

コレクションの読み込みに問題があります。私が持っているセットアップは、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で、ソリューション内のすべてのプロジェクトがビルドされていることを確認しました
  • スローされたすべての例外でブレークするようにデバッガーを設定します。コレクションに設定されていることを除いて、デバッガーは壊れません
4

1 に答える 1

3

問題は、PressJobRub.Departmentプロパティが設定されると、私のコードがのPressJobRun適切なコレクションにもを追加することDepartmentです。コレクションを初期化しましたが、メソッドを呼び出すときにNHibernateが使用するコレクションが何らかの理由で失敗するという問題がありましたContains()。質問で説明したgremlinについてはまだ疑問があります。また、 「コードのデバッグだけを有効にする」をオフにして、スローされた例外でもブレークするように設定したときに、デバッガーが例外でブレークしなかったのはなぜですか。

とにかく、解決策は、エンティティをコレクションに追加する呼び出しを回避するためにPressJobRun.Department、アクセスをフィールド(私の場合は)にマップすることです。Access.PascalCaseField(Prefix.mUnderscore)Department.PressJobRun

Krzysztof Kozmicの記事でこれが説明されていますが、私の場合、コレクションは初期化されていませんでした。

于 2012-08-01T14:00:19.030 に答える