0

なぜこれが起こっているのか誰か説明してもらえますか - クライアントとプロジェクトの間に1対多のマッピングがあります。

以下は、それぞれのマッピング ファイル内の 2 つの関係です。

クライアント:

<!-- Relationship with project -->
<bag name="projects" cascade ="all-delete-orphan" lazy="false">
  <key column="client_id" />
  <one-to-many class="Project" ></one-to-many>
</bag>

計画:

<many-to-one name="client"
         class="Client"
         column="client_id"
         cascade="all-delete-orphan" 
         fetch="join"
         not-null="false"
         lazy="false" />

以下は、特定のクライアントを返す Web メソッドです。

public Client RetrieveEqualsClient(string propertyName, object propertyValue)
{
    Client c = new Client();
    ConfigureNHibernate();
    using (ISession session = m_SessionFactory.OpenSession())
    {
        ICriteria criteria = session.CreateCriteria(typeof(Client));
        criteria.Add(Expression.Eq(propertyName, propertyValue));
        c = criteria.List<Client>()[0];

        return c;
    }
}

次のように aspx ページからメソッドを呼び出します。

$.ajax
(
    {
        type: "post",
        url: "NHibernateWebService.asmx/RetrieveEqualsClient",
        data: "{id: " + id + "}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        error: function (result) { alert("Failure: " + result.statusText); },
        success: function (result) { alert(result); }    
     }
 )

これにより例外が発生します: NHibernate LazyInitializationException: failed to lazily initialize a collection, no session or session was closed, here - //これは Client クラスにあります

public virtual IList<Project> projects 
{
    get { return c_projects ?? ( c_projects = new List<Project>()); }//Exception Occurs Here!
    set { c_projects = value; }
}

この例外についてさまざまな質問をしましたが、うまくいきませんでした。

4

2 に答える 2

1

取得する例外は、のスコープ外でプロジェクト コレクションを読み込もうとしているために発生しますISession
これはおそらく、シリアライズ時にプロパティがシリアライザーによって読み取られ、usingスコープ外で発生するために発生しています。
最善の方法は、 POCO をシリアル化する代わりに dto を使用することです。

したがって、コードは次のようになります。

using (ISession session = m_SessionFactory.OpenSession())
    {
        ICriteria criteria = session.CreateCriteria(typeof(Client));
        criteria.Add(Expression.Eq(propertyName, propertyValue));
        var list = criteria.List<Client>();
        if (!list.Any())
           return null;
        return new ClientDTO(list[0]);
    }

また、クライアントからプロパティ名を取得する際に行う動的クエリについてもわかりません。
UI コードとデータベースの間に強い結合を作成しています (Id プロパティが変更された場合、それは jQuery コードを変更する必要があることを意味します...)

実際、クライアントが常に Id を使用してクライアントを要求する場合、そのGet<Client>(id)方法はより適切であり、エラーが発生しにくくなります。

于 2012-08-24T19:54:43.940 に答える
1

プロジェクトの設定fetch="join"を試みます:

<bag name="projects" cascade ="all-delete-orphan" fetch="join"> 
  <key column="client_id" /> 
  <one-to-many class="Project" ></one-to-many> 
</bag>
于 2012-08-24T12:54:39.907 に答える