在Silverlight中使用RIA服务时如何扩展实体?

时间:2011-07-19 18:48:16

标签: silverlight entity-framework-4 wcf-ria-services

在Silverlight解决方案的服务器端,我有2个项目。

  1. 提供Silverlight页面的网站。
  2. 实体框架数据访问层。
  3. 我有一个具有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客户端?

4 个答案:

答案 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可以非常简单地处理它。