WCF,OData的,的DbContext,并加入(WCF, OData, DbContext, a

2019-10-19 08:18发布

我要揭露既简单实体,并通过一个单一的WCF服务任命为OData的。 由于艺术家的名单和他们的专辑的领域,我知道我可以有一个的DbContext像这样:

   public class PickContext: DbContext {
      public DbSet<Album> Albums { get; set; }
      public DbSet<Artist> Artists { get; set; }
      public DbSet<List> Lists { get; set; }

从这我可以让OData服务是这样的:

   public class PickDataService : DataService<PickContext> {
      public static void InitializeService(DataServiceConfiguration config) {
         config.SetEntitySetAccessRule("Lists", EntitySetRights.AllRead);
         config.SetEntitySetAccessRule("Artists", EntitySetRights.AllRead);
         config.SetEntitySetAccessRule("Albums", EntitySetRights.AllRead);

我也知道,我可以介绍一个类来压平列表,艺术家和专辑有所成加盟像这样:

   public class PickContainer {
      private PickContext pickContext=new PickContext();
      public IQueryable<Foo> Foos { get; private set; }

      public PickContainer() {
         Foos=from a in pickContext.Albums
               select new Foo {
                  ID=a.ID, Title=a.Title, Rating=a.Rating, Newness=a.Newness, Chance=a.Chance,
                  LastChosen=a.LastChosen, Acquired=a.Acquired, Media=a.Media, ArtistID=a.ArtistID,
                  ArtistName=a.Artist.Name, ListID=a.Artist.ListID };
      }
   }

然后我可以创建第二个服务来主持这个连接实体:

   public class PickService : DataService<PickContainer> {
      public static void InitializeService(DataServiceConfiguration config) {
         config.SetEntitySetAccessRule("Foos", EntitySetRights.AllRead);

但我不能工作了是是否有办法有两套实体在一个容器中,更重要的是,在一个单一的服务 。 这可能吗? 我打得四处$扩大=艺术家,但如果我风与客户端上的扁平模式我的生活会更容易。 当我尝试包括FOOS在PickContext并将其添加到PickDataService,我得到一个异常“给定名称‘FOOS’在实体集没有被发现。”

Answer 1:

WCF使用实体框架特定的数据服务提供商。 您可以了解更多在这里 。 每个服务只使用一个供应商。 你不能在一个服务组合多个供应商。



Answer 2:

您正在尝试混用实体框架提供商(PickContext),并在同一服务提供商的反思(PickContainer),但WCF数据服务并不支持这一点,因为你只能为一个服务提供一个供应商。

但是你可以通过存档此网页API 。

考虑设立以下控制器:

public class AlbumsController : ODataController
{
    [Queryable]
    public IQueryable<Album> Get()
    {
        return new PickContext().Albums;
    }
}

public class FoosController : ODataController
{
    [Queryable]
    public IQueryable<Foo> Get()
    {
        var Foos = from a in new PickContext().Albums
                   select new Foo
                   {
                       ID = a.ID,
                   };

        return Foos;
    }
}

并添加路由配置部分如下:

  ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
  builder.EntitySet<Album>("Albums");
  builder.EntitySet<Foo>("Foos");
  IEdmModel model = builder.GetEdmModel();

  config.Routes.MapODataRoute(
      routeName:"odata",
      routePrefix:"odata",
      model: model
  );

然后,你可以在同一个服务的根访问两个:

http://host/odata/Albums
http://host/odata/Foos


文章来源: WCF, OData, DbContext, and Joins