2012-10-08 78 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