WCF Code First DataServices可以返回NotMapped属性吗?

时间:2012-02-03 00:08:31

标签: wcf entity-framework-4 code-first dataservice

我将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 个答案:

答案 0 :(得分:4)

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

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

[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 { }
    }
}

答案 1 :(得分:2)

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

编辑:

可能需要私人制定者(How do you configure a get-only property for a Silverlight-enabled WCF service

答案 2 :(得分:2)

以下是我在这些情况下使用的内容,类似于tyrongower所说的内容:

注意:这适用于WCF和REST WCF以及JSON

[DataContract]
public class Submission
{
    [NotMapped]
    [DataMember]
    public string Location
    {
        get { return ""; }
        set { }
    }
}

答案 3 :(得分: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属性!