0

我已经在 Visual Studio Express 2010 中建立了 wcf Web 服务。我正在使用 Linq to Sql 来操作数据库。因为我有基于 EmpID 的关系的表 EmpMaster(主键表)和 EmpDetail(F 键表)。到目前为止,我在本地部署了这个 Web 服务。并尝试在我的 Web 应用程序中使用 Linq to sql Query 访问员工主数据和详细数据。我的 Web 应用程序是基于 MVC 的应用程序。而员工主数据我可以通过网络服务在网络应用程序中访问。但默认情况下它应该加载员工详细信息条目。因为默认情况下DeferredLoadingEnabled 是启用的。我可以在调试 Web 服务时看到 Web 服务中的记录集。但是在 Web 应用程序中访问 emp 详细列表数据时出现错误。作为

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

我在客户端网络配置中添加:

<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 时,例如,将向数据库发送一个新请求以获取与 master 的 EmpDetail 对应的 EmpDetail。

当然,数据库必须可用(上下文仍然存在)。

您可以在调试时看到 EmpDetail 数据:当您尝试在 Debug 中查看实体的导航属性时,它还会查询数据库以获取值。

为了避免这些问题,您可以“手动”预先加载您知道需要的数据(顺便说一下,如果您知道以后需要所有这些数据,您将避免多次调用数据库)。

为此,您可以使用

Include()扩大。

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

或在对象中选择您需要的值(匿名与否)

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

编辑

正确的。我习惯于 Linq to entity 和 c#,而您使用 Linq to SQL 和 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 对象的序列化错误。并且错误说循环引用...... bla bla bla ..不知道为什么。正如我在数据库上下文类中检查的那样,似乎没有任何东西。然后我尝试删除 sql server 中两个表之间的映射。听起来对我有用。...第二种方式就在这里

于 2012-06-28T11:03:31.447 回答