2016-11-28 3 views
0

ASP.NET OData APIバージョン6.0を使用しています タイプなしオブジェクトを使用してEDMモデルを作成しています。 私は自分のデータベースにセマンティックデータモデルを持っているので、オブジェクト型のクラッシュ操作は同じコードを使って行われます。だから、基本的には、ODataクエリ文字列を解析し、オブジェクトをロードする独自の方法にそれを適用するコントローラを1つ作成するだけです。私はこれをすべてほぼ実践しています。どのようにルーティングダイナミックを定義するには欠けているもの....ASP.NET OData、型なし/型なしエンティティを同じコントローラにルーティング

エンティティx、y、zを同じコントローラを使用するようにマップするにはどうすればよいですか?

モデルを構築するためのコードは、以下のようになります。 IdentitiesController、ResourcesController、SystemsController、OrgunitsControllerという名前のコントローラにルーティングされます。しかし、それらはすべて同じコントローラー "NativeObjectsController"にルーティングする必要があります。

以下は、可能なエンティティタイプのセットです...エンドユーザーが独自のタイプを作成できるため、特殊なコントローラー今のところ...

public static void Register(HttpConfiguration config) 
{ 
    IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault(); 
    IODataPathHandler pathHandler = new DefaultODataPathHandler(); 

    config.MapODataServiceRoute(
    routeName: "ODataRoute", 
    routePrefix: "odata/dataobjects", 
    model: GetEntityModel() 
    // ,pathHandler: pathHandler, 
    //routingConventions: routingConventions 
); 

    var routes = config.Routes; 
    config.AddODataQueryFilter(); 
    config.EnsureInitialized(); 
} 

public static EdmModel GetEntityModel() 
{ 
    if (model != null) 
    return model; 

    model = new EdmModel(); 
    EdmEntityContainer container = new EdmEntityContainer(ns_ois, "OISContainer"); 
    model.AddElement(container); 

    AddDataObjectTypeToModel(model, container, "IDENTITY", "Identities"); 
    AddDataObjectTypeToModel(model, container, "RESOURCE", "Resources"); 
    AddDataObjectTypeToModel(model, container, "SYSTEM", "Systems"); 
    AddDataObjectTypeToModel(model, container, "ORGUNIT", "OrgUnits"); 

    return model; 
} 

private static void AddDataObjectTypeToModel(EdmModel model, EdmEntityContainer container, string dataObjectSystemName, string entitySetName) 
{ 
    DataObjectTypeController dotController = Factory.Default.CreateController<DataObjectTypeController>(); 
    int dotId = dotController.GetId(dataObjectSystemName); 
    DataObjectType dot = dotController.GetDataObjectType(dotId); 

    var entityObject = new EdmEntityType(ns_ois, dataObjectSystemName); 
    model.AddElement(entityObject); 
    entityObject.AddKeys(entityObject.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32, false)); 
    entityObject.AddStructuralProperty("UId", EdmPrimitiveTypeKind.Guid, false); 
    entityObject.AddStructuralProperty("DisplayName", EdmPrimitiveTypeKind.String, false); 

    foreach (var property in dot.GetProperties()) 
    { 
    } 

    var entitySet = container.AddEntitySet(entitySetName, entityObject); 
} 

答えて

0

私は、コントローラを選択できるように私のIODataRoutingConventionを作成しました。

public class DataObjectTypeRoutingConvention : IODataRoutingConvention 
{ 
    public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap) 
    { 
    return null; 
    } 

    public string SelectController(ODataPath odataPath, HttpRequestMessage request) 
    { 
    if (odataPath.PathTemplate.StartsWith("~/entityset",System.StringComparison.InvariantCultureIgnoreCase)) 
     return "DataObjects"; 
    else 
     return null; 
    } 
} 

し、私は、最初の規則

public static void Register(HttpConfiguration config) 
{ 
    IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault(); 
    IODataPathHandler pathHandler = new DefaultODataPathHandler(); 

    routingConventions.Insert(0, new Controllers.DataObjectTypeRoutingConvention()); 

    config.MapODataServiceRoute(
    routeName: "ODataRoute", 
    routePrefix: "odata/dataobjects", 
    model: GetEntityModel(), 
    pathHandler: pathHandler, 
    routingConventions: routingConventions 
); 

    config.AddODataQueryFilter(); 

    config.EnsureInitialized(); 
} 
ように添加しました
関連する問題