4

我目前正在开发一个项目,该项目同时使用 Entity Framework(与 .NET Framework 3.5 SP1 版本一起打包的版本)和许多基于 AJAX 的功能,我在客户端使用 jQuery 和 ASP.NET WebMethods 来实现这些功能服务器端。

我通常使用接受实体作为参数的 WebMethod 创建新实体,如下所示:

 [WebMethod]
 public static void Add(User user);

调用此方法时,我在 JavaScript 中组装类似于实体(就属性而言)的对象,并将其作为 JSON 字符串传递。但是,当尝试以多对多关系传递相关实体时,我遇到了问题。假设 User 实体与 Flight 实体具有一对多的关系 - 添加具有多个(新)航班的新用户被证明是有问题的。以下方法:

 this.user.Flight = [];
 var x = new Object();
 // Code here to populate x's properties
 this.user.Flight.push(x);
 // Repeat again for more flights

导致 ASP.NET 错误(在反序列化阶段),指出无法将 List 转换为 EntityCollection。

然后我尝试了这种方法:

 this.user.Flight = {};
 var x = new Object();
 // Code here to populate x's properties
 this.user.Flight.firstFlight = x;
 // Repeat again for more flights

在这种情况下,WebMethod 被成功调用,但航班完全丢失(在 WebMethod 中调用 user.Flight.Count() 返回 0)。

有谁知道如何将 EntityCollection 中的多个航班传递给 WebMethod?

4

2 回答 2

2

在尝试直接使用 EF 实体类时,使用内置序列化程序可能会遇到一些困难。即使您能够从 javascript 数组反序列化为 EntityCollection,也无法采用其他方式(EF 对象图到 js obj):您会得到著名的“循环引用”错误。

我有很多使用 EF 和 Web 服务的项目(但我还没有使用动态数据的东西)。可能还有其他一些不错的选择供您尝试。您可能能够创建 DTO 或 POD 类(“数据传输对象”或“普通旧数据”)类,它们代表您的实体类的所有属性和关系(但不包含方法或其他代码)。这些可以很容易地序列化和反序列化并通过网络传递。但是,您可能仍然会遇到循环引用错误。对于那些,您可以使用支持循环引用的Json.NET进行自己的序列化。必须修改您的服务以返回字符串,并且您必须在 javascript 调用站点将 json 字符串评估为对象文字。那'

您可以使用DataSvcUtil.exe创建您的 DTO 类。

话虽如此,我已经建立了一个项目,我目前正在尝试解决您的问题。我收到您所说的相同错误,以及您在 javascript 中从 [] 切换到 {} 时提到的相同行为。我会继续努力,如果我发现了什么,请告诉你。

于 2009-11-19T22:06:56.613 回答
1

为什么不直接返回Flight的列表作为第二个参数,然后在您的方法中将它们添加到User中?

我不使用EF参数的[WebMethod],而且我通常将POD结构作为参数传递,所以我从来没有遇到过这个问题......

于 2009-11-19T19:17:37.317 回答