2012-10-08 47 views
0

我已经实现了一个Web服务,并通过ajax调用它。
注意:我的实体已经作为实体框架代码的第一个用途。通过Web服务返回实体框架类的问题

我的AJAX看起来如下:

$.ajax({ 
    type: "GET", 
    url: "/MyProject/MyService.svc/GetEntity", 
    data: "entityID=1", 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    success: AjaxSucceeded, 
    error: function (msg, status, extra) { 
     alert(status + " - " + extra); 
    } 
}); 

AjaxSucceeded是简单地用数据变量,其中我只是在控制台记录数据的功能。

我GetEntity功能目前看起来是这样的:

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json)] 
public MyEntity GetEntity(int entityID) 
{ 
    AccessObject accessObject = new AccessObject("MyConnectionString"); 

    MyEntity theEntity = accessObject.GetByID(entityID); 

    return theEntity; 
} 

我已经测试这与故意的测试创建了一个类和它的工作如预期(例如,我创造了一个Web服务中的myEntity所类非常简单,一些属性,没有其他方法等)。

当我返回一个我为代码优先的实体框架所做的实体时,出现这些问题。它不起作用,多次调用Web服务函数,然后在控制台中显示一个错误,指出“我的服务功能无法加载资源”。

供参考,这是我的实体:

[DataContract(IsReference=true)] 
public class MyEntity 
{ 
    #region Properties 

    [Key] 
    [DataMember] 
    public int ID { get; set; } 

    public bool SomeBoolean { get; set; } 

    [StringLength(1000)] 
    public string Description { get; set;} 

    #endregion 

    #region Relationships 

    public virtual SomeOtherEntity OtherEntity { get; set; } 

    #endregion 

} 

我只设置ID是数据成员进行测试,但仍然没有成功。

任何人都可以指出我正确的方向吗?我知道Web服务工作,因为其他功能的工作,如果我建立一个本地(在Web服务)类,它将返回没有问题。所以我假设它与实体框架属性有关系?我可能是错的,但这就是我所能想象的。

谢谢你的时间。

哦也,仅供参考,我的服务类具有以下属性:

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
+0

我尽量不把这个问题提交给一篇论文。对不起,它的长度。 – ThePower

+0

你的wcf服务是“支持ajax的wcf服务”吗? –

+0

@JoshC。是的。 – ThePower

回答

2

的问题是根本的实体没有真正建立进行序列化。我的建议是创建一个DTO,将相关属性映射到相应的属性上,然后通过导线传递,例如

public class EntityDto 
{ 
    public int ID { get; set; } 
    public string Description { get; set; } 
    ... 
} 

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json)] 
public EntityDto MyEntity(int entityId) 
{ 
    AccessObject accessObject = new AccessObject("MyConnectionString"); 
    MyEntity theEntity = accessObject.GetByID(entityID); 
    return new EntityDto() 
    { 
     ID = theEntity.ID, 
     Description = theEntity.Description, 
     ... 
    }; 
} 
+0

@ThePower您不应该从不仅仅是DTO的Web服务返回任何东西。您的网络服务是一项合约,如果不立即破坏客户,您就无法更改。返回你的实体意味着你不能改变它们,但是如果你有一个DTO,你可以改变你的实体并更新映射,从而让你的客户满意。 – Andy

+0

@ThePower只是为了增加安迪所说的话,您还需要考虑实体具有与消费者无关的属性/数据负载这一事实,因此您需要使用不必要的带宽。经验法则是 - 仅通过线路发送消费者所需的信息。此外,拥有不同的模型可以让问题保持清晰的分离,即您的实体用于持久性,您的DTO用于在层/层之间传递数据。考虑到这是一个面向公众的API,就像Andy提到的那样,这可以让您灵活地更改后端,而不会影响您的API。 – James

+0

非常好,谢谢你们的信息。我没有把它作为一种API风格的网络服务。对于网站的特定部分来说,更需要在客户端工作,我需要拨打几个电话并获取一些数据以供显示。但是现在把它看作是一个面向公众的API,我完全理解,它也开启了API的机会!谢谢 – ThePower