2011-09-24 105 views
0

我正在創建一個基於SOA的應用程序,我已經使用Framework 4.0創建了WCF服務項目,因爲我在WCF操作中使用實體框架合同方法我正在使用類由EF生成的,但WCF不能識別這些對象,當我在設計模式下檢查這些類,它們就像在WCF中使用EF實體類

[EdmEntityTypeAttribute(NamespaceName="quizTestDBModel", Name="tbl_adminUser")] 
    [Serializable()] 
    [DataContractAttribute(IsReference=true)] 
    public partial class tbl_adminUser : EntityObject 
    { 
     #region Factory Method 

    /// <summary> 
    /// Create a new tbl_adminUser object. 
    /// </summary> 
    /// <param name="adminUserId">Initial value of the adminUserId property.</param> 
    public static tbl_adminUser Createtbl_adminUser(global::System.Int32 adminUserId, global::System.String name, global::System.String userid, global::System.String password) 
    { 
     tbl_adminUser tbl_adminUser = new tbl_adminUser(); 
     tbl_adminUser.adminUserId = adminUserId; 
     return tbl_adminUser; 
    } 

    #endregion 
    #region Primitive Properties 

    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.Int32 adminUserId 
    { 
     get 
     { 
      return _adminUserId; 
     } 
     set 
     { 
      if (_adminUserId != value) 
      { 
       OnadminUserIdChanging(value); 
       ReportPropertyChanging("adminUserId"); 
       _adminUserId = StructuralObject.SetValidValue(value); 
       ReportPropertyChanged("adminUserId"); 
       OnadminUserIdChanged(); 
      } 
     } 
    } 
    private global::System.Int32 _adminUserId; 
    partial void OnadminUserIdChanging(global::System.Int32 value); 
    partial void OnadminUserIdChanged(); 

    #endregion 

} 

當我使用這個類在我的作業合同

int adminRegister(tbl_adminUser _adminUser); 

它給出了該方法的錯誤,「該操作在WCF Test Client中不受支持,因爲它使用tbl類型_adminUser」

感謝

+0

我不想爲映射創建額外的類,我想在我的操作合約中使用tbl_adminUser,謝謝 – MZH

回答

4

如果要跨服務邊界傳遞特定於平臺的數據,那麼你不使用SOA。

實體框架類特定於.NET和實體框架。不要通過服務邊界傳遞它們。

我還注意到,您希望客戶遵守您的命名約定(tbl_adminUser)以及涉及表格的事實。爲什麼您的服務的調用者需要了解有關通過使用名爲tbl_adminUser的表實現「管理員用戶」概念的事實?

您應該創建一個名爲的數據傳輸對象類,例如AdminUser。它應該具有管理員用戶的所有有趣公共方面的屬性(顯然,只是AdminUserId)。它根本就沒有行爲 - 只是數據。

這是應該由您的服務發送和接收的類。

而且,是的,你必須實現映射代碼。

+0

非常感謝,是的「tbl_adminUser」這是我的表,它有很多屬性,但是要顯示我刪除其他數據屬性和tbl_adminUser的成員,我需要重新命名它們,實際上我想註冊一個用戶,所以客戶端應該發送一個AdminUser對象,EF應該保存在DB中,那就是我的整個想法 – MZH

+0

因此,映射到我的服務上必須,我必須手動完成,有沒有其他方法 – MZH

+1

有幾百種方法可以避免重複編寫代碼。使用一個。 [Automapper](http://www.codeproject.com/KB/library/AutoMapper.aspx)是其中之一。不過,我從來沒有使用過它。 –

1

錯誤只是說WCF測試客戶端不支持您的合同,但並不意味着WCF本身不支持您的合同。 WCF測試客戶端用於測試最常見的情況,並且不支持所有WCF功能。編寫測試應用程序或使用更強大的測試工具(如SoapUI)來驗證您的服務是否有效。

同樣遵循@ John的建議,因爲您當前的設計具有可怕的命名約定,它暴露基於EntityObject的實體,並且它遠離SOA。根據你的描述,簡單的CRUD作爲一項服務公開。您將以更快的速度獲得與WCD數據服務類似的結果。