Как я могу расширить сущность при использовании служб RIA с Silverlight? - PullRequest
7 голосов
/ 19 июля 2011

На стороне сервера моего решения Silverlight у меня есть 2 проекта.

  1. Веб-сайт, который обслуживает страницу Silverlight.
  2. Уровень доступа к данным Entity Framework.

У меня есть сущность со свойствами FirstName и LastName.Я хочу добавить свойство FullName, которое будет доступно со стороны клиента Silverlight.

Я добавил свойство:

namespace Server.DAL.Model
{
    public partial class Contact
    {
        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", this.FirstName, this.LastName);
            }
        }
    }
}

При тестировании со стороны сервера это новое свойство присутствуети работает правильно.Свойство НЕ присутствует на стороне клиента Silverlight.Я попытался добавить класс метаданных с атрибутом Include, но так как string является примитивным типом, я получаю следующую ошибку при компиляции:

Свойство 'FullName' в типе сущности 'Contact' не может бытьпомечен атрибутом IncludeAttribute, поскольку «String» не является допустимым типом сущности.Типы сущностей не могут быть примитивными или простыми, такими как string или Guid.

Как сделать это свойство доступным для клиента Silverlight?

Ответы [ 4 ]

6 голосов
/ 20 июля 2011

Добавьте [DataMember] к свойству FullName. Здесь - некоторые инструкции по добавлению методов / свойств в ComplexTypes.Они могут также применяться к сущностям.Может быть, с помощью класса приятеля, я не пробовал это для сущностей.

namespace Server.DAL.Model
{
    public partial class Contact
    {
        [DataMember]
        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", this.FirstName, this.LastName);
            }
        }
    }
}
1 голос
/ 20 июля 2011

Вы должны поместить код, которым вы поделились, в файл с именем Contact.shared.cs. Инструментарий WCF RIA берет этот код точно и создает файл в проекте Silverlight с этим кодом. Затем клиентский код получает доступ к этому члену и дублирует код, скомпилированный в проекте сервера.

Подробнее о общем коде в документах MSDN .

0 голосов
/ 28 марта 2012

ИМХО Я думаю, что добавление свойства в модель данных - не лучший подход, так как мне нравится поддерживать чистоту модели (и не зависит от конкретной реализации, поэтому мои объекты работают над различными проектами без помех от других проектов).Для решения этой проблемы я использую Методы расширения .Вот ТОЧНЫЙ тот же сценарий (из моего кода) с использованием методов расширения вместо добавления его к датабоду.

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 могут справиться с этим довольно тривиально.

0 голосов
/ 19 июля 2011

Я полагаю, вы пользуетесь услугами RIA? Если это так, проблема заключается в том, что RIA Services будет копировать только структуру ваших серверных классов на клиент, а не любой пользовательский код, который вы написали в свойствах или методах.

Хорошая новость в том, что решение простое, и вы почти у цели. Службы RIA генерируют клиентские классы как частичные классы, как это делает Entity Framework на сервере. Это означает, что вы можете расширить эти классы в проекте Silverlight, используя частичные классы, точно так же, как вы делали это в проекте сервера.

Просто переместите свой класс из серверного проекта в проект Silverlight, убедитесь, что ваше пространство имен соответствует пространству имен класса RIA Services, сгенерированного для вас, и вам будет хорошо.

Удачи!

...