0

我已经实现了一个 Web 服务,我通过 ajax 调用它。
注意:我的实体是为实体框架代码第一目的而制作的。

我的 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 设置为 DataMember 进行测试,但仍然没有成功。

谁能指出我正确的方向?我知道 Web 服务可以工作,因为其他功能也可以工作,如果我设置了一个本地(在 Web 服务内)类,它会毫无问题地返回它。所以我假设它与实体框架属性有关?我可能错了,但这就是我能想象的。

感谢您的时间。

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

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

1 回答 1

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,
        ...
    };
}
于 2012-10-08T13:58:23.213 回答