我将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返回未映射到数据库列的属性?
答案 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属性!