【问题标题】:Silverlight enabled WCF Service and Entity Framework 504 issueSilverlight 启用 WCF 服务和实体框架 504 问题
【发布时间】:2013-03-25 08:00:46
【问题描述】:

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

这就是我所做的:

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

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

HTTP/1.1 504 Fiddler - 接收失败 内容类型:文本/html;字符集=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 服务一起使用?

任何帮助将不胜感激。

【问题讨论】:

  • 有人吗?我相信你们中的许多人都做过这样的事情!?!

标签: wcf silverlight entity-framework mvvm http-status-code-504


【解决方案1】:

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

在我的测试项目中,我使用的是北风数据库。我想用推荐的 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; }
}

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

希望对你有帮助。

【讨论】:

  • 我想这可以解决问题。然而,我放弃了我的做法,转而使用 RIA,它可以很好地序列化实体。
猜你喜欢
  • 2014-03-30
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多