4

我将 WCF 数据服务用于返回 JSON 响应的 RESTful API。

考虑这个对象:

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

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

WCF 不会像我期望的那样对待这个对象。我的服务请求完全忽略了 Person 对象序列化中的 Age 属性。

我一直在使用一种解决方法,将 Age 属性映射到一个虚拟数据库列,然后创建一个什么都不做的 setter。多么丑陋的黑客!有没有更好的方法让 DataService 返回未映射到数据库列的属性?

4

4 回答 4

4

经过大量研究,并且在 stackoverflow 上没有相反的证据,我将继续说答案是:不。具有使用 EntityFramework 4 映射的实体的 WCF DataService 不能返回未映射的属性。

我一直在使用的丑陋的 hack 就是这个,它要求你在数据库中创建一个永远不会被读取的字段。

[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 { }
    }
}
于 2012-02-09T02:46:36.037 回答
2

Here's what I used in those situations, similar to what is stated by tyrongower:

NOTE: this works with WCF and REST WCF as well as with JSON

[DataContract]
public class Submission
{
    [NotMapped]
    [DataMember]
    public string Location
    {
        get { return ""; }
        set { }
    }
}
于 2012-08-22T17:52:14.360 回答
1

您可能需要使用 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(); }
    }
}

编辑:

可能需要私有设置器(如何为启用 Silverlight 的 WCF 服务配置 get-only 属性

于 2012-02-03T00:36:22.937 回答
0

我也遇到了这个问题并决定使用扩展方法。例如:

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 属性!

于 2012-03-14T21:57:10.967 回答