0

我正在构建一个 Silverlight MVVM 模板,并且遇到了 WCF 服务返回和实体对象。

这是我所做的:

  1. 在服务器端使用实体框架
  2. 创建了一个带有几个表的小型测试数据库。
  3. 在服务器端创建了 WCF 服务
  4. 然后我创建了一个返回整数的小测试方法。
  5. 在我的客户端,我添加了一个服务引用,并且我在完成的方法中成功收到了整数结果
  6. 然后更改了我的测试服务方法以返回一个“Person”对象(这是来自实体框架的实体)
  7. 更新了我的服务参考,然后它不起作用!
  8. 然后我将返回类型返回到任何基本 CLR 类型,它再次工作

我检查了 Fiddler,在我的服务响应中收到以下504错误:

HTTP/1.1 504 Fiddler - 接收失败 Content-Type: text/html; charset=UTF-8 连接:关闭时间戳:08:56:23.783

[Fiddler] ReadResponse() 失败:服务器没有返回对此请求的响应。

在试图弄清楚这一点后,我遇到了WCF Trace Logging并发现了这个错误:

    There was an error while trying to serialize parameter :BasicResult. The InnerException message was 'Type 'MVVMProject.Web.DataSource.Person' with data contract name 'Person:http://schemas.datacontract.org/2004/07/MVVMProject.Web.DataSource' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'.  Please see InnerException for more details.

我不明白为什么这么难?我必须在我的实体上设置一些属性以使其可序列化吗?如果我查看 Entity Framework 的 Designer.cs 文件,我会在 Entity 上看到一个 Serializable 属性。当然这意味着我可以通过 WCF 服务传递它???我不明白这个错误,不幸的是......

甚至可以将实体框架与 WCF 服务一起使用吗?

任何帮助将不胜感激。

4

1 回答 1

1

我遇到了同样的问题,似乎DataContractSerializeref 对象的导航属性有问题。

在我的测试项目中,我使用的是北风数据库。我想用推荐的 DbContext 测试 CodeFirst 方法。

提供的导航属性是虚拟的,它们是按需加载的,但 ef 只是返回,导航属性上的实体的第一级已填充。

在序列化实体对象时,DataContractSerializer 失败,因为实体对象不再绑定到 DbContext 并且导航属性的序列化失败。

当我尝试通过我的 wcf 服务使用 NW Employee 对象时,就会发生这种情况。

我的想法是将所有数据复制到具有数据合约属性的新对象中!

服务电话:

public IEnumerable<EmployeeWcf> GetAll()
    {
        IEnumerable<EmployeeWcf> result = null;

        result = from e in context.Employees.OrderBy( e => e.LastName ) 
                         select new EmployeeWcf 
                         { 
                             EmployeeId = e.EmployeeID, 
                             Firstname = e.FirstName, 
                             Lastname = e.LastName 
                         };

        return result;
    }

班上:

    [DataContract]
public class EmployeeWcf
{
    [DataMember]
    public int EmployeeId { get; set; }
    [DataMember]
    public string Firstname { get; set; }
    [DataMember]
    public string Lastname { get; set; }
}

这项工作,但在我看来,这不是一个完美的解决方案。

我希望这可以帮助你。

于 2013-04-15T08:25:22.050 回答