【问题标题】:Entity Framework 4.0 - Can I send a complex type to the client over WCF?Entity Framework 4.0 - 我可以通过 WCF 向客户端发送复杂类型吗?
【发布时间】:2010-07-04 19:56:08
【问题描述】:

嘿,任何人都可以确认以下方案是否可行:

  • 我正在.NET 4.0 中开发一个三层应用程序:Winforms 客户端、aspx 服务器和 SQL 2008 数据库。
  • 服务器通过 Entity Framework 4.0 与 SQL 2008 数据库通信,并通过 WCF 将 STE 形式的实体(在单独的程序集中)返回给客户端应用程序。

现在我想在 SQL 服务器上执行一个存储过程,它将返回一个自定义形状的数据格式(不是与实体的 1:1 映射)。我读到我可以使用复杂类型来保存将返回给我的数据。

现在的问题是:这种复杂类型是否可以通过 WCF 序列化,以便客户端也可以使用它?我想是的,但似乎无法在任何地方找到最终答案,我想在继续编码之前确定。

谢谢!

TJ

【问题讨论】:

  • 您是只发送复杂类型,还是与正在发送的某种根实体相关的复杂类型?
  • 复杂类型将是我模型中使用的实体的一些存储过程计算和数据转换(如不同类型的平均值等)的结果。所以是的,复杂类型显然与实体有关,但 IMO 使用 SP 的计算比使用 LINQ 或其他 .NET 函数更容易实现。而且对服务器的影响会很小。不推荐这种方法吗?
  • 为了进一步澄清,我在其他 WCF 合同调用中将普通实体发送给客户端(例如在客户端上填充下拉列表等)。但是在我现在要实现的具体合约功能中,需要进行这些计算。我猜我有 3 个选项,要么将所有实体发送到客户端并让它进行处理,要么在 aspx 服务器上进行处理,或者通过 SP 进行处理,然后使用服务器将结果传递给客户端(现在是我打算走的路,因此我的问题)。

标签: wcf entity-framework-4 self-tracking-entities complextype


【解决方案1】:

任何可以在 XML Schema 中表示的东西都可以被序列化,从而使用 WCF 通过网络发送。

这包括所有 .NET 基本基元类型,例如 int、double、string、DateTime 以及从这些类型构建的任何类。

不起作用的事情例如:

  • 任何 .NET 细节(如异常、泛型等) - 请记住,WCF 旨在实现互操作,而不仅仅是在两个 .NET 客户端之间

  • 任何具有固有行为的东西(如字典)

【讨论】:

  • 你说泛型不能通过 WCF 序列化?但是,我成功地发送了 List 类型的对象(其中 T 是我模型中的一个实体)。这些是泛型,对吗?由于我同时负责服务器和客户端,因此无意支持非 .NET 客户端。我知道这不完全是 WCF 的愿景,但这是我的选择。
  • @tjeuten:你不是在发送 List - 你是在发送 List。这是一个具体类的列表 - 必须知道该具体类并使用适当的序列化属性进行修饰。这就是您可以在 XML 模式中定义和表示的东西。涉及泛型的其他构造不会那么容易工作,并且您无法序列化真正“属于 T”的东西——其中 T 尚不为人所知。
  • WCF 确实支持Dictionary。
【解决方案2】:

如果您将复杂类型返回给 wcf 服务,或者如果您返回其属性之一为复杂类型的实体,则自跟踪实体将没有问题。但是,如果您使用 RIA 服务,则不支持复杂类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多