我正在创建一个基于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”
由于
答案 0 :(得分:4)
如果要跨服务边界传递特定于平台的数据,那么您就不使用SOA。
实体框架类特定于.NET和Entity Framework。不要将它们传递到服务边界。
我还要注意,您希望客户遵守您的命名约定(tbl_adminUser
),以及涉及表格的事实。为什么您的服务的呼叫者需要通过使用名为tbl_adminUser
的表来实现“管理员用户”概念的事实?
您应该创建一个名为的数据传输对象类,例如AdminUser
。它应该具有管理员用户的所有有趣的公共方面的属性(显然,只是AdminUserId
)。它应该没有任何行为 - 只是数据。
这是应该由您的服务发送和接收的课程。
而且,是的,你必须实现映射代码。
答案 1 :(得分:1)
该错误只是说WCF测试客户端不支持您的合同,但这并不意味着WCF本身不支持。 WCF测试客户端用于测试最常见的方案,它不支持所有WCF功能。编写测试应用程序或使用更强大的测试工具(如SoapUI)来验证您的服务是否正常工作。
同时遵循@ John的建议,因为您当前的设计具有糟糕的命名约定,它暴露了基于EntityObject
的实体,并且远离SOA。根据您的描述,它是简单的CRUD作为服务公开。您将更快地获得与WCD数据服务类似的结果。