0

我刚刚使用 Visual Studio Express 2012 for Web 开始了一个新的 Silverlight 项目。

我使用 EF 5 创建了启用 Silverlight 的 WCF 服务来访问 SQL Server 数据库。

我遇到的问题是该服务似乎无法返回从数据库中检索到的任何实体。返回一个新实体或任何旧对象就好了,但是当我尝试从上下文中返回一个实体时,我得到以下异常:

{System.ServiceModel.CommunicationException: The remote server returned an error: NotFound. --->      System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException:  The remote server returned an error: NotFound.
   at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
   at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassa.<EndGetResponse>b__9(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)
   --- End of inner exception stack trace ---
   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
   --- End of inner exception stack trace ---
   at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at NewProj.DataSvcRef.DataServiceClient.DataServiceClientChannel.EndGetAgency(IAsyncResult result)
   at NewProj.DataSvcRef.DataServiceClient.NewProj.DataSvcRef.DataService.EndGetAgency(IAsyncResult result)
   at NewProj.DataSvcRef.DataServiceClient.OnEndGetAgency(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}

服务方法代码再简单不过了:

[OperationContract]
public Contact GetContact(int aID)
{
  Contact res = null;
  using (var db = new OFBEntities())
  {
    try
    {
      res = db.Contacts.Find(aID);
    }
    catch (Exception ex)
    {
      res = null;
    }

    return res;
  }
}

正如我所提到的,如果我返回一个新创建的对象(return new Contact(){ name="test contact};),或者返回一个不在上下文中的类型(例如一个整数),一切正常。

这是快速版本的限制,还是我忘记了一些设置?过去,我创建了一些使用 VS 2010、Silverlight 4 消耗数据服务的 Silverlight 应用程序,我不记得需要设置什么特别的东西,但也许我只是忘记了我做了什么?

任何帮助表示赞赏!

编辑: 它与 DbContext 及其序列化方式有什么关系吗?我以前从未使用过 DbContext,我总是使用 EF 4 中的默认 ObjectContext ...

EDIT2:解决方案 已经有一段时间了,但我还有其他事情要做:o)如果有人在同一条船上,问题出在服务的序列化中。DbContext 默认创建代理,不同意序列化。我还不确定为什么——事实上,我需要对这些代理进行自我教育——但是禁用它们可以解决我的序列化问题。感谢 Pawel 的评论,我错误地认为我的序列化工作正常,重新检查服务器端错误让我回到了正确的轨道上。

4

1 回答 1

0

问题在于 DBContext 的自动代理创建,它干扰了序列化。默认情况下,代理在 DBContext 中处于启用状态,您可以在类构造函数中禁用它们

  this.Configuration.ProxyCreationEnabled = false;

或在创建 DBContext 的实例之后

  using (var db = new myDBContext())
  {
    db.Configuration.ProxyCreationEnabled = false;

    ...
  }

不知道为什么,但它的工作原理。是时候去阅读了!

于 2013-01-22T02:41:47.813 回答