2014-02-15 63 views
1

我想通過單個WCF服務公開OData中的簡單實體和連接。由於藝術家的名單和他們的專輯的領域,我知道我可以有一個的DbContext像這樣: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); 

但我不能工作了是是否有辦法有兩套實體在一個容器中,更重要的是,在單個服務。這可能嗎?我玩過$ expand = Artist,但是如果我在客戶端上展開平坦模型,我的生活將會變得更加輕鬆。當我嘗試在PickContext中包含Foos並將其添加到PickDataService時,我得到一個異常「實體集中找不到」給定名稱Foos「。」

回答

0

WCF使用特定的數據服務提供商爲實體框架。你可以瞭解更多here。 每項服務僅使用一個提供者。您不能在一項服務中混用多個提供商。

0

您試圖在同一服務中混合使用實體框架提供程序(PickContext)和反射提供程序(PickContainer),但WCF數據服務不支持此操作,因爲您只能爲一個服務提供一個提供程序。

但您可以通過Web 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; 
    } 
} 

,並添加路由配置部分如下:

http://host/odata/Albums 
http://host/odata/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 
); 

然後你就可以在同一個服務的根訪問這兩個