动态添加实体集到ODataConventionModelBuilder或ODataModelBuilder

时间:2018-02-16 23:42:08

标签: asp.net-web-api odata

有没有办法将EntitySet动态添加到ODataConventionModelBuilder。

我正在.net中处理OData服务。我们将返回的一些实体来自外部组件。我很好地阅读了程序集并获得了相关类型,但由于这些类型是变量,我不确定如何将它们定义为实体集。

示例:

    public static void Register(HttpConfiguration config)
    {
        //some config house keeping here

        config.MapODataServiceRoute("odata", null, GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

        //more config housekeeping
    }

    private static IEdmModel GetEdmModel()
    {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.Namespace = "SomeService";
        builder.ContainerName = "DefaultContainer";

        //These are the easy, available, in-house types
        builder.EntitySet<Dog>("Dogs"); 
        builder.EntitySet<Cat>("Cats");
        builder.EntitySet<Horse>("Horses"); 

        // Schema manager gets the rest of the relevant types from reading an assembly.  I have them, now I just need to create entity sets for them

        foreach (Type t in SchemaManager.GetEntityTypes)
        {
            builder.AddEntityType(t); //Great!  but what if I want EntitySET ?
            builder.Function(t.Name).Returns<IQueryable>();  //See if you can put correct IQueryable<Type> here.

            //OR

            builder.EntitySet<t>(t.Name);  //exception due to using variable as type, even though variable IS a type

        }

        return builder.GetEdmModel();
    }

1 个答案:

答案 0 :(得分:0)

想出来。只需在循环中添加此行:

builder.AddEntitySet(t.Name,builder.AddEntityType(t));