在Silverlight解决方案的服务器端,我有2个项目。
我有一个具有FirstName和LastName属性的实体。我想添加一个可以从Silverlight客户端获得的FullName属性。
我添加了属性:
namespace Server.DAL.Model
{
public partial class Contact
{
public string FullName
{
get
{
return string.Format("{0} {1}", this.FirstName, this.LastName);
}
}
}
}
从服务器端进行测试时,此新属性存在且工作正常。该属性不存在于Silverlight客户端。我尝试使用Include
属性添加元数据类,但由于字符串是基本类型,因此在编译时出现以下错误:
实体类型“联系人”中的属性“FullName”无法标记 IncludeAttribute,因为'String'不是有效的实体类型。 实体类型不能是基本类型或类似字符串的简单类型 或指导。
如何将此属性提供给Silverlight客户端?
答案 0 :(得分:6)
将[DataMember]添加到FullName属性。 Here是有关向ComplexTypes添加方法/属性的一些说明。它们也可能适用于实体。也许使用好友类,我没有尝试过这个实体。
namespace Server.DAL.Model
{
public partial class Contact
{
[DataMember]
public string FullName
{
get
{
return string.Format("{0} {1}", this.FirstName, this.LastName);
}
}
}
}
答案 1 :(得分:1)
您应该将已共享的代码放入名为Contact.shared.cs
的文件中。 WCF RIA工具将此代码完全,并使用该代码在Silverlight项目中创建一个文件。然后,客户端代码可以访问该成员,并可以复制服务器项目中编译的代码。
以下是有关shared code in the MSDN docs的更多信息。
答案 2 :(得分:0)
我假设您正在使用RIA服务?如果是这样,问题是RIA Services只会将服务器端类的结构复制到客户端,而不是您在属性或方法中编写的任何自定义代码。
好消息是,解决方案很简单,你几乎就在那里。 RIA Services将客户端类生成为部分类,就像实体框架在服务器上所做的那样。这意味着您可以使用部分类在Silverlight项目中扩展这些类,与您在服务器项目中完全相同。
只需将您的类从服务器项目移动到Silverlight项目,确保您的命名空间与为您生成的RIA服务类的命名空间匹配,并且您将会很高兴。
祝你好运!答案 3 :(得分:0)
恕我直言,我认为将属性添加到数据模型并不是最好的方法,因为我喜欢保持模型清洁(而不是特定于实现,因此我的实体可以在各种项目中工作而不会与其他项目混淆)。我解决此问题的方法是使用扩展方法。以下是使用扩展方法的完全相同的场景(来自我的代码),而不是将其添加到数据库。
namespace <MyAppName>.Services.Entities
{
public static class UserExtension
{
public static String FullName(this User user)
{
return String.Format("{0} {1}", user.First, user.Last);
}
}
}
请注意方法的参数及其定义(即,这不是普通方法定义)。我有一个“Common.dll”,它保存了我的应用程序的基本例程,它始终被引用...所以我将扩展方法放在该DLL中。我还确保扩展方法的命名空间完全匹配实体的命名空间。如果您这样做,该方法将显示在实体上,就像它是实体的一部分一样。
唯一的缺点是你必须将它作为方法来实现,并且不能将其定义为属性 ....这意味着没有直接的数据绑定。但是你的ViewModel或IValueConverter可以非常简单地处理它。