【问题标题】:EntityFramework with WCF - how to return EF entitiesEntityFramework with WCF - 如何返回 EF 实体
【发布时间】:2013-01-30 02:10:47
【问题描述】:

我有一个可以工作的 WCF 服务,但它使用标准 ADO.net 来调用一些存储过程。

维护起来有点麻烦和烦人,因为我调用的任何存储过程都必须映射到必须手动创建的 DataContracts,然后以 JSON 格式返回。

我想将 WCF 服务转换为返回 EntityFramework 实体(因此我不必继续手动映射和创建数据契约)。

我的方法中有这样的东西,例如:

public List<GetStuff_Result> GetStuff(string param1)
{
            ...

            StuffEntities ctx = new DataContracts.StuffEntities();

            List<GetStuff_Result> list = ctx.GetStuff(5463, "test").ToList();

            return list;
}

我已经在 edmx 模型中设置了存储过程以返回 GetStuff_Result(我导入了存储过程并使用了“创建复杂函数”)

我已经调试过了,我在列表中得到了 2 个结果,但是当我通过浏览器调用我的 WCF 方法时,我在浏览器(chrome)上收到一条消息:

No data received
Unable to load the web page because the server sent no data.
Here are some suggestions:
Reload this web page later.
Error 324 (net::ERR_EMPTY_RESPONSE): The server closed the connection without sending any data. 

谁能告诉我如何解决这个问题,或者至少告诉我为什么会这样?

注意(1):我还右键单击了 edmx 文件并禁用了延迟加载。

注意 (2):我已经设置了一个 DbContext 生成器

注(3):我使用WebMessageFormat.Json的响应格式

谢谢

【问题讨论】:

标签: c# .net wcf entity-framework entity-framework-5


【解决方案1】:

这个问题实际上非常适合 WCF 数据服务(与 WCF SOAP 无关)。

http://msdn.microsoft.com/en-us/library/dd744841.aspx

默认情况下,WCF 数据服务将返回 XML 格式的数据,但是有一个请求参数告诉它返回 JSON

http://blogs.msdn.com/b/writingdata_services/archive/2011/02/25/getting-json-out-of-wcf-data-services.aspx

【讨论】:

  • 这是一个不错的选择,但它意味着相当多的重写。我正在寻找一种在标准 WCF 中执行此操作的方法
  • IQueryable&lt;T&gt; 作为返回类型帮助了我。我已经和这个战斗了一天。由于无法设置MaxJsonLength 并且只是在返回集中丢失了数据,所以我一直在返回太多之间来回跳动。
【解决方案2】:

1) 在部署之前在 WCF 测试客户端中测试您的应用程序总是一个好主意,这样您就可以查看服务调用是否有效

2) 发生这种情况的原因是,如果您运行直接存储过程或使用 EF GetStuff_Result 执行它并不重要,您仍然必须将 [DataMember] 分配给您的 GetStuff_Result 类中的每个变量,因此它将是序列化 EF 存储过程不会自动为您序列化结果。

【讨论】:

  • 所以你说的是实体框架永远不能返回具有这些属性的实体......所以使用实体框架有点毫无意义,因为我仍然需要映射到我手动创建的数据合约对象。似乎很奇怪微软不能支持这个..
  • 你可以生成我相信的类,但我怀疑你可以在不提供属性的情况下对其进行序列化
  • 即使 user1808494 为我提供了更有效的选择,这就是答案 - 如果不提​​供属性就无法完成
  • 不是将 DataMember 分配给 EF 实体,而是在单独的数据合同项目中创建另一组对象,并拥有一个映射器,它将 EF 实体属性分配给数据合同类并使用数据合同和数据成员标记这些类属性。
  • 是的,我这样做了,但我认为这很痛苦,因为您仍在做所有映射对象的工作..尽管我可能会尝试使用 AutoMapper 插件,但似乎很容易使用
【解决方案3】:

其实我找到了更好的方法

我可以设置 edmx 代码生成器来使用这个: http://visualstudiogallery.msdn.microsoft.com/32c4660d-7e66-4c3a-b516-584f4f72b838

它的 DbContext 支持 WCF(因此它生成的对象已经具有 DataMember 和 DataContract 属性)

这允许在服务中返回对象,而无需像 COLD TOLD 建议的那样将 EF 对象映射到 WCF 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2020-10-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多