5

我有一个简单的小数据模型,类似于以下内容:

库存上下文 {

IEnumerable<Computer> GetComputers()

IEnumerable<Printer> GetPrinters()

}

电脑 {

public string ComputerName { get; set; }

public string Location { get; set; } }

打印机 {

public string PrinterName { get; set; }

public string Location { get; set; }

}

结果来自非 SQL 源,因此该数据并非来自连接到数据库的实体框架。

现在我想通过 WCF OData 服务公开数据。到目前为止,我发现这样做的唯一方法是创建我自己的数据服务查询提供程序,根据这个博客教程:

http://blogs.msdn.com/alexj/archive/2010/01/04/creating-a-data-service-provider-part-1-intro.aspx

...这很棒,但似乎是一项相当复杂的工作。提供程序的代码将比我的整个数据模型长 4 倍,以生成所有资源集和属性定义。

在实体框架和从零开始编写自己的数据源之间是否有类似通用提供程序的东西?也许某种方式来构建一个对象数据源或其他东西,这样神奇的 WCF 独角兽就可以拿起我的数据并骑到日落而不必显式地编写提供程序的代码?

4

3 回答 3

2

您可以使用所谓的“反射提供者”。这假设您有一个返回 IQueryable 的属性(或许多属​​性)(T 是您的实体类型)。观看此视频,了解简单的“操作方法”以帮助您入门。 http://msdn.microsoft.com/en-us/data/cc745968.aspx

于 2010-06-11T10:09:45.490 回答
1

您可以使用内置的反射提供程序

将以下内容添加到您的 InventoryContext:

IQueryable<Computer> Computers { get { return GetComputers().AsQueryable(); } }
IQueryable<Printer> Printers { get { return GetPrinters().AsQueryable(); } }

并按如下方式修改实体(您需要添加对System.Data.Services.Client项目的引用):

using System.Data.Services.Common;

[DataServiceKey("ComputerName")]
public class Computer 
{
    public string ComputerName { get; set; }
    public string Location { get; set; } }
}

[DataServiceKey("PrinterName")]
public class Printer
{
    public string PrinterName { get; set; }
    public string Location { get; set; } }
}

完成后,只需将数据服务指向 InventoryContext,如下所示:

public InventoryDataService : DataService<InventoryContext>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        config.UseVerboseErrors = true;         
    }
}

这应该是你需要做的所有事情。InventoryContext 需要有一个无参数的构造函数。

于 2011-01-07T00:56:15.043 回答
0

您可以使用 WCF 数据服务工具包。

它最初是由一群来自微软的人编写的,它允许一种非常灵活的方式来创建不基于实体框架的 OData 服务。

Jonathon Carter 去年在 mix 上做了一个出色的演示,围绕 Mongo DB 包装了一个 OData 服务。

http://channel9.msdn.com/events/MIX/MIX11/FRM16

该代码也可在 codeplex http://wcfdstoolkit.codeplex.com/上获得

希望这可以帮助。

于 2012-02-03T02:13:56.267 回答