【问题标题】:Exposing additional properties on entities in WCF Data Services在 WCF 数据服务中的实体上公开其他属性
【发布时间】:2012-11-14 12:17:41
【问题描述】:

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


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

我想,

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

* 为简洁起见,让我们假设一个 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

【问题讨论】:

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


    【解决方案1】:

    除非它在 ​​.NET 4.5 中发生变化(我没有看过),否则我认为这行不通。 DataService<T> 非常有限。它甚至不支持所有 EF 功能。数据服务本身非常灵活,you can define an entirely custom service which returns anything you want。但是,您不会获得 EF 上下文的“自动”映射。

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

    【讨论】:

    • 我明白了。我不认为这是数据服务本身会关心的事情。相反,那个 EF 在某个地方让我大笑。我认为数据服务主要只是将 URI/方法映射到实体及其成员。手动修改实体定义与从修改后的模式重新生成实体定义有什么区别?
    • EF 模型完全不知道您的扩展属性。 DataService<T> 从 EF 模型派生其键入信息。因此,只有真正属于您的 EF 模型的属性才会显示出来。
    • 知道了;我一直在探索较新版本的 WCF DS 中提供的一些功能,以及自定义服务定义。也许在某个地方,易于实施和灵活性之间的平衡将会浮出水面。
    【解决方案2】:

    还有另一种方法,即使用 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&lt;YouObjectContext&gt; 派生来创建服务,而是从DataService&lt;MyClassesDataSource&gt; 派生它

    现在我正在尝试找出在该数据源中处理 EF 上下文的最佳方法:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多