0

Visual StudioExpress2010でwcfWebサービスを構築しました。LinqtoSqlを使用してデータベースを操作しています。ここで、EmpIDに基づく関係を持つテーブルEmpMaster(主キーテーブル)とEmpDetail(Fキーテーブル)があります。現在、このWebサービスをローカルにデプロイしました。WebアプリケーションでLinqtosqlQueryを使用して従業員のマスターデータと詳細データにアクセスしようとしています。私のWebアプリケーションはMVCベースのアプリケーションです。一方、従業員のマスターデータは、Webサービスを介してWebアプリでアクセスできます。ただし、デフォルトでは従業員の詳細エントリが読み込まれるはずです。デフォルトDeferredLoadingEnabled では有効になっています。Webサービスのデバッグ中に、Webサービスの一連のレコードを確認できます。しかし、Webアプリケーションでemp詳細リストデータにアクセスしているときにエラーが発生します。なので

"the underlying connection was closed the connection was closed unexpectedly "

クライアントのWeb構成に追加しました:

<binding name="BasicHttpBinding_IEmployeeManagerService"  openTimeout="10:10:00" receiveTimeout="10:10:00" sendTimeout="10:10:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="104857600" maxBufferPoolSize="104857600" maxReceivedMessageSize="104857600"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
       <readerQuotas maxDepth="104857600" maxStringContentLength="104857600"
                     maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600" />

       </binding>

何が問題なのですか?

   **`**Edited:**`** 

Public Function GetEmployeeDetail(ByVal id As String) As EmployeeDetail Implements IEmployeeManagerService.GetEmployeeDetail
    Dim _empDetail As New EmployeeDetail()
    If Not id Is Nothing Then
        _empDetail = _dbContext.EmployeeDetails.Where(Function(e) e.EmpId = id ).FirstOrDefault()
    End If
    Return _empDetail
End Function
4

2 に答える 2

1

遅延読み込み(または遅延読み込み)とは、あなたの場合、EmpDetailデータが「呼び出された」ときにのみ取得されることを意味します。

したがって、EmpMasterデータを取得し、たとえば、プロパティmaster.EmpDetail.Nameを使用すると、マスターのEmpDetailに対応するEmpDetailを取得するために、新しい要求がデータベースに送信されます。

もちろん、データベースが利用可能である必要があります(コンテキストはまだ生きています)。

デバッグ中にEmpDetailデータを確認できます。デバッグでエンティティのナビゲーションプロパティを確認しようとすると、データベースにクエリを実行して値を取得します。

これらの問題を回避するには、必要になることがわかっているデータを「手動で」熱心にロードできます(ちなみに、後でこれらすべてのデータが必要になることがわかっている場合は、データベースへの複数回の呼び出しを避けます)。

それに、あなたは使用することができます

Include()拡大。

context.EmpMaster.Include("EmpDetail").Where...

または、オブジェクトに必要な値を選択します(匿名かどうか)

your query.Select(m => new {
   m.Name,
   m.EmpDetail.Propertyx,
 ...
 });

編集

右。私はLinqtoentityとc#に慣れており、LinqtoSQLとvb.netを使用しています。

したがって、使用する方法はInclude()ありませんが、多分LoadWith()

「EmployeeDetail」クラスに「Status」プロパティがある場合は、そのようなことを試すことができます。

Public Function GetEmployeeDetail(ByVal id As String) As EmployeeDetail Implements IEmployeeManagerService.GetEmployeeDetail
    Dim _empDetail As New EmployeeDetail()
    If Not id Is Nothing Then
         Dim dlo As DataLoadOptions = New DataLoadOptions()
         dlo.LoadWith(Of EmployeeDetails)(Function(e As EmployeeDetails) e.Status)
         _dbContext.LoadOptions = dlo
        _empDetail = _dbContext.EmployeeDetails.Where(Function(e) e.EmpId = id ).FirstOrDefault()
    End If
    Return _empDetail
End Function

「ステータス」プロパティを取得していない場合は、内部結合を行う必要があります。EmpMasterとEmployeeDetailについても同じ考え

于 2012-06-27T06:39:28.147 に答える
0

wel..wel..wel ....トリックを見つけましたが、答えが得られませんでした。EmpMasterとEmpDetailの間のマッピングを削除してから、.dbmlを再生成しました。少なくとも今回は、すべてが完璧に機能します。しかし、通常のasp.net Webサービスで試したところ、EmpMasterオブジェクトのシリアル化エラーが発生しました。エラーは循環参照と言っていました...blablabla..理由はわかりません。Database Contextクラスをチェックインしたとき、そのようなものは何もなかったようです。次に、SQLサーバーの両方のテーブル間のマッピングを削除してみました。私のために働いているように聞こえます。...2番目の方法はここにあります

于 2012-06-28T11:03:31.447 に答える