在WCF数据服务中的实体上公开其他属性

时间:2012-11-14 12:17:42

标签: c# asp.net entity-framework wcf-data-services

我觉得我可能会遗漏一些关键的东西(或只是简单),但是我无法解决这个问题。


鉴于我已经创建了一个ASP.NET(.NET 4.0)Web应用程序项目,我在其中托管了WCF数据服务。 我已从现有数据库生成了POCO实体的EF 5.0模型,并且通常实体类为partial

我想,

  

Gee,我将“扩展”这些部分类,以在数据服务中公开其他(非持久,计算)属性 *

*为了简洁起见,我们假设一个Person实体,我想要添加一个FullName属性,该属性连接FirstNameLastName

无论如何,我继续我的业务继续partial课程(当然在同一名称空间

public partial class Person {
    public string FullName {
        get { return this.FirstName + " " + this.LastName; }
    }
}

但是,当我在服务中查询Person实体时,没有FullName。当我查询服务的$metadata时,没有FullName的定义。

需要做什么(,如果有什么)来支持这个?


备注

  • 所有实体均可通过config.SetEntitySetAccessRule("*", EntitySetRights.All);
  • 查看
  • 我尝试使用各种属性进行装饰但没有成功,包括EdmScalarPropertyAttributeDataMemberAttribute

2 个答案:

答案 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上下文的最佳方法是什么:)