我觉得我可能会遗漏一些关键的东西(或只是简单),但是我无法解决这个问题。
鉴于我已经创建了一个ASP.NET(.NET 4.0)Web应用程序项目,我在其中托管了WCF数据服务。
我已从现有数据库生成了POCO实体的EF 5.0模型,并且通常实体类为partial
。
我想,
Gee,我将“扩展”这些部分类,以在数据服务中公开其他(非持久,计算)属性 * 。
*为了简洁起见,我们假设一个Person
实体,我想要添加一个FullName
属性,该属性连接FirstName
和LastName
。
无论如何,我继续我的业务继续partial
课程(当然在同一名称空间)
public partial class Person {
public string FullName {
get { return this.FirstName + " " + this.LastName; }
}
}
但是,当我在服务中查询Person
实体时,没有FullName
。当我查询服务的$metadata
时,没有FullName
的定义。
需要做什么(,如果有什么)来支持这个?
备注
config.SetEntitySetAccessRule("*", EntitySetRights.All);
EdmScalarPropertyAttribute
和DataMemberAttribute
。答案 0 :(得分:2)
除非在.NET 4.5中改变(我没看过),我认为这不会起作用。 DataService<T>
非常有限。它甚至不支持所有EF功能。数据服务本身非常灵活,you can define an entirely custom service which returns anything you want。但是你没有得到EF上下文的“自动”映射。
所以你不得不在“容易但有限”和“困难但灵活”之间做出选择,而且两者之间几乎没有任何关系。
答案 1 :(得分:1)
通过使用POCO还有另一种方式,正如这篇优秀文章中所述:http://www.codeproject.com/Articles/514598/Understanding-OData-v3-and-WCF-Data-Services-5-x (转到使用POCO创建WCF数据服务部分)
基本上它描述了这个:
您可以使用以下属性修饰POCO实体:
[DataServiceEntity]
[DataServiceKey("Id")]
public class MyClass
{
public int Id { get; set; }
}
然后创建一个暴露静态IQueryable&lt;&gt;的类您的实体集合的成员:
public class MyClassesDataSource
{
public static IQueryable<MyClass>
{
get
{
... // You can access your EF context here
}
}
}
最后,不是通过从DataService<YouObjectContext>
派生来创建服务,而是从DataService<MyClassesDataSource>
现在我想弄清楚在该数据源中处理EF上下文的最佳方法是什么:)