在WCF中使用EF实体类

时间:2011-09-24 18:36:29

标签: wcf entity-framework

我正在创建一个基于SOA的应用程序,我使用Framework 4.0创建了WCF服务项目,因为我正在使用Entity框架,在WCF操作中合同方法我正在使用EF生成的类,但是WCF无法识别这些对象,当我在设计器模式下检查这些类时,它们就像

[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测试客户端不支持该操作,因为它使用类型tbl_adminUser”

由于

2 个答案:

答案 0 :(得分:4)

如果要跨服务边界传递特定于平台的数据,那么您就不使用SOA。

实体框架类特定于.NET和Entity Framework。不要将它们传递到服务边界。

我还要注意,您希望客户遵守您的命名约定(tbl_adminUser),以及涉及表格的事实。为什么您的服务的呼叫者需要通过使用名为tbl_adminUser的表来实现“管理员用户”概念的事实?

您应该创建一个名为的数据传输对象类,例如AdminUser。它应该具有管理员用户的所有有趣的公共方面的属性(显然,只是AdminUserId)。它应该没有任何行为 - 只是数据。

这是应该由您的服务发送和接收的课程。

而且,是的,你必须实现映射代码。

答案 1 :(得分:1)

该错误只是说WCF测试客户端不支持您的合同,但这并不意味着WCF本身不支持。 WCF测试客户端用于测试最常见的方案,它不支持所有WCF功能。编写测试应用程序或使用更强大的测试工具(如SoapUI)来验证您的服务是否正常工作。

同时遵循@ John的建议,因为您当前的设计具有糟糕的命名约定,它暴露了基于EntityObject的实体,并且远离SOA。根据您的描述,它是简单的CRUD作为服务公开。您将更快地获得与WCD数据服务类似的结果。