2014-07-03 84 views
9

我已經使用pocos創建了一個相當簡單的域模型。我已經使用EntityTypeConfiguration<TEnitityType>類將這些映射到EF DB上下文。這一切工作正常。如何獲得Web API odatamodelbuilder以使用EF流利API映射

我現在正在嘗試使用ODataConventionModelBuilder創建一個OData V4 WebAPI控制器端點,而這正是情況正在惡化的地方。它一切正常,直到遇到不是基於約定的關聯。但我找不到一種方法讓ODataBuilder從我的EntityTypeConfiguration<TEnitityType>類中找到映射。

這讓我有2個難吃選項

  • 裝飾我可愛的乾淨波蘇斯骯髒的屬性。使用手動ODataBuilder

不知道

  • 重新映射所有非約定基於映射如果代碼樣本將幫助,但在這裏,他們是無論如何,我已經簡化爲簡潔的實體。

    var builder = new ODataConventionModelBuilder(); 
    
          builder.EntitySet<Item>("Items"); 
          config.MapODataServiceRoute(
           routeName: "odata", 
           routePrefix: "odata", 
           model: builder.GetEdmModel(), 
           batchHandler: new DefaultODataBatchHandler((GlobalConfiguration.DefaultServer))); 
    
    public class Item 
        { 
         public Int32 Id { get; set; } 
    
         public Int16 ItemTypeId { get; set; }     
    
         public virtual ItemType Type { get; set; } 
         public virtual ICollection<ItemVersion> Versions { get; set; } 
         public virtual ICollection<ItemTag> Tags { get; set; }  
        } 
    

    在遇到ItemTags集合,這裏的問題就來了是一個ItemTag:

    public class ItemTag 
        { 
         public Int32 ItemId { get; set; } 
    
         public string Tag { get; set; } 
    
         public Item Item { get; set; } 
        } 
    

    ,你可以看看是不是根據慣例,我有一個配置類,如下所示:

    public class ItemTagConfiguration : EntityTypeConfiguration<ItemTag> 
        { 
         public ItemTagConfiguration() 
         { 
          HasKey(x => new {x.ItemId, x.Tag}); 
    
          HasRequired(x => x.Item) 
           .WithMany(y => y.Tags) 
           .HasForeignKey(x => x.ItemId); 
    
         } 
        } 
    

    有誰知道一種方法,我可以使用這些EntityTypeConfiguration文件與ODataBuilder或Web API?

    編輯

    如果發現this page這似乎表明有可能與EF 6,我使用。我想要做的是這個

    ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
    modelBuilder.EntitySet<Dbf>("Dbfs"); 
    //   modelBuilder.Configurations.Add(new DbfMap()); <---- NO GOOD - Needs Class from DBContext we only have a model builder :(
    Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); 
    config.Routes.MapODataRoute("ODataRoute", "odata", model); 
    

    但構建器沒有配置屬性。

  • +2

    Fanstatic!做了一些更多的谷歌搜索和「OData的網頁API流利的數據映射」排名靠前的搜索結果現在會這樣的問題。 –

    +1

    你有沒有想過這個?我正在爲完全相同的事情而哭泣。 –

    回答

    0

    兩件事情:

    1. 我看過各種各樣的渠道來反對使用延遲加載和系列化病區;這基本上是OData的內容; (它甚至使用了system.runtime.serialization.datacontract和datamember屬性)

    2. 我已經在從上下文顯式加載以及在modelBuilder中爲dbContext定義導航屬性方面取得了更多成功。我知道你正在尋找自定義的導航屬性,但我相當肯定這些都是覆蓋ODataModelBuilder類的有用的方法(這不假設很多,需要更少的實體框架工作)。你已經提到過使用EF的地方,我想這就是你將要工作的方向,如果你不需要別名,你可以使用約定命名爲每個Set添加一個條目。

      的EntitySet( 「routePrefixName」)

    在建設EdmModel,它直徑達你用流利以前所做的關係。如果您必須向基礎模型添加無關項目,則應將每個類定義爲EntityType <>(),只設置密鑰。 EdmBuilder可以使用輕度屬性和關鍵關聯附加到ODataConventionModelBuilder中的EF模型。

    我已經摔跤了一段時間,並且似乎沒有關於.Net OData v4的大量信息,可能是由於整個強制datetimeoffset問題。

    希望幫助有些