3

我有以下代碼:的Web API的OData 2 EDM異常

public class AwardTitle 
{ 
    public int AwardTitleId 
    { 
     get; 
     set; 
    } 

    public int? EpisodeId 
    { 
     get; 
     set; 
    } 

    public virtual AwardEpisode Episode 
    { 
     get; 
     set; 
    } 
} 

public class AwardEpisode 
{ 
    public int EpisodeId 
    { 
     get; 
     set; 
    } 
} 

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapODataRoute("ODataRoute", "api", GetImplicitEDM()); 
    } 
} 

private static Microsoft.Data.Edm.IEdmModel GetImplicitEDM() 
{ 
    var builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<AwardTitle>("AwardTitles"); 

    return builder.GetEdmModel(); 
} 

通知我如何只繪製了AwardTitle類......不是AwardEpisode類。

現在,當我瀏覽到控制器時,我希望得到一個關於沒有映射的AwardEpisode的錯誤。但是,沒有錯誤。實際上,除了AwardTitle正在檢索... AwardEpisode也正在被檢索...沒有任何明確的電話這樣做。

這怎麼可能?這應該是可能的?

我使用ASP.Net的Web API 2在Windows 7

+0

我敢打賭,EDM發生器使用反射隱遁地創造所有的依賴類。也許有一個設置告訴模板生成器忽略一個類。 – 2014-11-06 21:43:45

+0

這是通過這種方式設計的。 – vittore 2014-11-06 21:48:10

+0

vitore,我不認爲它是由設計。每隔一段時間我實現控制器,除非我使用$ expand專門請求它們,否則不包含相關類 – Chris 2014-11-07 00:43:02

回答

1

ODataConventionModelBuilder默認映射類型T的原始,複雜,和導航功能.EntitySet<TEntityType>(string name) API調用性能。該code是:

private void MapEntityType(EntityTypeConfiguration entity) 
{ 
    IEnumerable<PropertyInfo> properties = ConventionsHelpers.GetProperties(entity, includeReadOnly: _isQueryCompositionMode); 
    foreach (PropertyInfo property in properties) 
    { 
     bool isCollection; 
     StructuralTypeConfiguration mappedType; 

     PropertyKind propertyKind = GetPropertyType(property, out isCollection, out mappedType); 

     if (propertyKind == PropertyKind.Primitive || propertyKind == PropertyKind.Complex) 
     { 
      MapStructuralProperty(entity, property, propertyKind, isCollection); 
     } 
     else 
     { 
      // don't add this property if the user has already added it. 
      if (!entity.NavigationProperties.Where(p => p.Name == property.Name).Any()) 
      { 
       NavigationPropertyConfiguration addedNavigationProperty; 
       if (!isCollection) 
       { 
        addedNavigationProperty = entity.AddNavigationProperty(property, EdmMultiplicity.ZeroOrOne); 
       } 
       else 
       { 
        addedNavigationProperty = entity.AddNavigationProperty(property, EdmMultiplicity.Many); 
       } 

       addedNavigationProperty.AddedExplicitly = false; 
      } 
     } 
    } 

的測試用例example

public void ModelBuilder_Products() 
{ 
    var modelBuilder = new ODataConventionModelBuilder(); 
    modelBuilder.EntitySet<Product>("Products"); 

    var model = modelBuilder.GetEdmModel(); 

    var product = model.AssertHasEntitySet(entitySetName: "Products", mappedEntityClrType: typeof(Product)); 
    product.AssertHasPrimitiveProperty(model, "ReleaseDate", EdmPrimitiveTypeKind.DateTime, isNullable: true); 
    product.AssertHasComplexProperty(model, "Version", typeof(ProductVersion), isNullable: true); 
    product.AssertHasNavigationProperty(model, "Category", typeof(Category), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); 

要更改默認的行爲,我們可以忽略屬性:

var builder = new ODataConventionModelBuilder(); 
builder.Entity<AwardTitle>().Ignore(a => a.Episode); 
builder.EntitySet<AwardTitle>("AwardTitles"); 

return builder.GetEdmModel();