3

我觉得我可能在这里遗漏了一些关键(或只是简单)的东西,但是我无法让它工作。


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

我想,

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

* 为简洁起见,让我们假设一个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);
  • 我尝试使用各种属性进行装饰,但没有成功,包括属性EdmScalarPropertyAttributeDataMemberAttribute属性。
4

2 回答 2

2

除非它在 ​​.NET 4.5 中改变(我没看过),否则我认为这行不通。DataService<T>非常有限。它甚至不支持所有 EF 功能。数据服务本身非常灵活,您可以定义一个完全自定义的服务来返回您想要的任何内容。但是,您不会获得 EF 上下文的“自动”映射。

因此,不幸的是,您必须在“简单但有限”和“困难但灵活”之间做出选择,两者之间几乎没有任何区别。

于 2012-11-14T13:01:45.793 回答
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<> 成员的类:

public class MyClassesDataSource
{

    public static IQueryable<MyClass>
    {
         get
         {
             ... // You can access your EF context here
         }
    }
}

最后,不是通过派生来创建服务,DataService<YouObjectContext>而是从DataService<MyClassesDataSource>

现在我试图弄清楚在该数据源中处理 EF 上下文的最佳方法是什么:)

于 2013-02-21T13:32:48.263 回答