【问题标题】:Use EF entity classes in WCF在 WCF 中使用 EF 实体类
【发布时间】:2011-09-24 18:36:29
【问题描述】:

我正在创建一个基于 SOA 的应用程序,我使用 Framework 4.0 创建了 WCF 服务项目,因为我使用的是实体框架,在 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”

谢谢

【问题讨论】:

  • 我不想为映射创建额外的类,我想在我的操作合同中使用 tbl_adminUser 谢谢

标签: wcf entity-framework


【解决方案1】:

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

Entity Framework 类特定于 .NET 和 Entity Framework。不要让它们跨越服务边界。

我还注意到您希望您的客户遵守您的命名约定 (tbl_adminUser),以及涉及到表格的事实。为什么你的服务的调用者需要知道你已经通过使用名为tbl_adminUser 的表实现了“管理员用户”的概念这一事实?

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

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

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

【讨论】:

  • 非常感谢,是的“tbl_adminUser”这是我的表,里面有很多属性,但是为了显示我删除了其他数据属性和tbl_adminUser的成员,我需要重命名它们,实际上我想要注册一个用户,所以客户端应该发送一个 AdminUser 对象,EF 应该保存在数据库中,这就是我的全部想法
  • 所以在我的服务上映射是必须的,我得手动做,有没有其他方法
  • 有数百种方法可以避免编写重复代码。使用一个。 Automapper 就是其中之一。不过我从来没用过。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多