2011-09-24 104 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数据服务类似的结果。