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 は、単純に data 変数を持つ関数であり、コンソールにデータを記録するだけです。

私の 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 クラスを作成しましたが、これは非常に単純で、いくつかのプロパティがあり、他のメソッドはありません)。

コードファーストEntity Framework用に作成したエンティティを返すと、問題が発生します。機能しません。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 に答える