ArdAtak
ArdAtak

Reputation: 239

Dynamically Adding Entity Sets to ODataConventionModelBuilder or ODataModelBuilder

Is there a way to dynamically add EntitySets to an ODataConventionModelBuilder.

I'm working on an OData service in .net. Some of the entities we'll be returning are coming from an external assembly. I read the the assembly just fine and get the relevant types but since those types are variables I'm not sure how to define them as entity sets.

Example:

    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();
    }

Upvotes: 1

Views: 1831

Answers (1)

ArdAtak
ArdAtak

Reputation: 239

Figured it out. Just add this line inside the loop:

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

Upvotes: 6

Related Questions