2009-11-17 64 views
4

我目前正在使用实体框架(与.NET Framework版本3.5 SP1一起打包的版本)和大量AJAX基于的功能,我正在客户端使用jQuery并在服务器端使用ASP.NET WebMethods。通过ASP.NET在JSON中添加实体框架实体(一对多)WebMethod

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

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

调用此方法时,我组装类似的实体的对象(在性质方面)在JavaScript和将它作为JSON字符串传递。但是,当尝试以多对多关系传递相关实体时,我遇到了一个问题。假设一个用户实体与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错误(在反序列化阶段),指出列表不能转换为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成功调用,但丢失的航班完全(调用user.Flight.Count()中的WebMethod返回0)。

有没有人有任何想法如何我可以将一个EntityCollection中的多个航班传递给WebMethod?

+5

在这里,只是因为你的用户名让我发笑才得到赞扬。 – 2009-11-17 13:25:51

+1

+1确实,同上。 – grenade 2009-11-19 13:23:31

+0

我在代码中看不到EntityCollection。你能否提供额外的澄清/代码剪辑? – 2009-11-19 16:44:17

回答

1

为什么不返回飞行是清单作为第二个参数,然后将它们添加到您的方法中的用户

我不使用[的WebMethod]与EF参数,我一般通过POD结构作为参数,所以我从来没有这个问题....

+0

最后,我确实将它作为一个单独的参数传递并按照您的说法添加它。这工作得很好,但我想知道是否有一个“适当”(或至少更优雅)的方式。 – 2009-11-20 11:39:07

2

你可以使用有一定难度内置串行器,同时试图直接使用您的EF实体类。即使你能够从一个javascript数组反序列化为一个EntityCollection,你也无法走另一条路(EF object graph to js obj):你会得到着名的“循环引用”错误。

我有很多项目,我使用EF和Web服务(但我还没有使用动态数据的东西)。可能还有其他一些很好的选择供您尝试。您可以创建代表实体类的所有属性和关系(但不包含方法或其他代码)的DTO或POD类(“数据传输对象”或“普通旧数据”)类。这些可以很容易地序列化和反序列化,并通过电线传递。尽管如此,您仍可能会收到循环引用错误。对于那些,你可以使用支持循环引用的Json.NET做你自己的序列化。您的服务必须修改才能返回字符串,并且您必须在JavaScript调用站点上将json字符串评估为对象字面值。这并不是太多工作。

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

所有的说法,我有一个项目建立在我目前正在试图解决您的问题。我遇到了同样的错误,你说的,和你在JavaScript中从[]切换到{}时提到的相同的行为。我会继续尝试,并让我知道如果我找到任何东西。

+0

感谢您的可能解决方案。正如我上面发布的,我用一个单独的参数解决了它,但如果我有时间,我会尝试您的一个建议。 我不禁感到失望,这不是简单的做到这一点 - 基础似乎是有,但周围也有EF + JSON我喜欢太多的琐碎问题。不过,请让我知道你是否有进步。 – 2009-11-20 11:42:14