Может ли WCF Code First DataServices возвращать свойство NotMapped? - PullRequest
4 голосов
/ 03 февраля 2012

Я использую службы данных WCF для RESTful API, который возвращает ответ JSON.

учитывает этот объект:

[Table("person")]
public class Person
{
    [Column("dob", TypeName = "datetime")]
    public DateTime DateOfBirth { get; set; }

    [NotMapped]
    public int Age
    {
        get { return CalculateAge(); }
        set { }
    }
}

WCF не обрабатывает этот объект, как я ожидал.Мой запрос на обслуживание полностью игнорирует свойство Age в сериализации объекта Person.

Я использовал обходной путь, когда я сопоставляю свойство Age столбцу фиктивной базы данных и создаю установщик, который ничего не делает.Что за уродливый хак!Есть ли лучший способ заставить DataService возвращать свойство, которое не сопоставлено со столбцом базы данных?

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012

После долгих исследований и отсутствия доказательств обратного по отношению к стеку, я собираюсь продолжить и сказать, что ответ таков: Нет. Служба данных WCF с сущностями, сопоставленными с помощью EntityFramework 4, НЕ МОЖЕТ возвращать несопоставленные свойства.

Этот уродливый хак, который я использовал, требует от вас создания в базе данных поля, которое никогда не будет прочитано.

[Table("person")]
public class Person
{
    [Column("dob", TypeName = "datetime")]
    public DateTime DateOfBirth { get; set; }

    [Column("dummy1", TypeName = "int")]
    public int Age
    {
        get { return CalculateAge(); }
        set { }
    }
}
2 голосов
/ 22 августа 2012

Вот что я использовал в этих ситуациях, аналогично тому, что указано в tyrongower:

ПРИМЕЧАНИЕ: это работает с WCF и REST WCF, а также с JSON

[DataContract]
public class Submission
{
    [NotMapped]
    [DataMember]
    public string Location
    {
        get { return ""; }
        set { }
    }
}
2 голосов
/ 03 февраля 2012

Возможно, вам понадобится использовать атрибуты System.Runtime.Serialization, так как именно они будут смотреть на WCF.

Не уверен, что у вас может быть логика в ваших контрактах на данные.

[Table("person")]
[DataContract]
public class Person
{
    [Column("dob", TypeName = "datetime")]
    [DataMember]
    public DateTime DateOfBirth { get; set; }

    [NotMapped]
    [DataMember]
    public int Age
    {
        get { return CalculateAge(); }
    }
}

РЕДАКТИРОВАТЬ:

Может потребоваться частный установщик ( Как настроить свойство только для получения для службы WCF с поддержкой Silverlight )

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

Я тоже ударил эту загвоздку и решил использовать методы расширения. Например:

public static class PersonExtensions
{
    public static int GetAge(this Person person)
    {
        // your CalculateAge logic (simplified)
        return (DateTime.Now - person.DateOfBirth).TotalDays / 365;
    }
}

Затем в вашем потребителе DataServices вы можете сделать:

person.GetAge()

Да, это не так хорошо, как person.Age, но вы также не добавляете ненужные столбцы базы данных.

Обновление:

Другой альтернативой является расширение класса Person, содержащегося в справочнике услуг. Это можно сделать, создав частичный класс Person с тем же пространством имен, что и у справочного класса Person. Например:

public partial class Person
{
    public string int Age
    {
        get { return (DateTime.Now - this.DateOfBirth).TotalDays / 365; }
    }
}

Тогда модель DataServices Person будет иметь свойство Age!

...