如何在运行时为OData Web API构建EDM模型?

Vla*_*nko 7 odata asp.net-web-api asp.net-web-api2

我有一个案例,我需要通过OData公开的实体是完全动态的(例如,用户可以配置他想要公开的字段).来自存储库的查询结果存储在具有实际数据字典(FieldName/Value)的特殊泛型类中,因此CLR类型适用于所有类型.我对实体(实体名称,实体字段及其类型)有完整的了解.

因此,我无法使用Entity,EntitySet或HasKey(),EntityTypeConfiguration中的Property()等ODataModelBuilder方法在设计时构建EDM模型.

是否有可能从头开始构建EDM模型?ODataModelBuilder使用EntityTypeConfiguration,但它依赖于实体的CLR类型.基本上我需要声明几种具有一种CLR类型的实体类型.

请指教.

Vla*_*nko 9

好的,所以我已经找到了这个问题的答案.

我编写了自己的OData模型构建器,它使用Microsoft.Data.Edm.Library命名空间(EdmModel,EdmEntityType等)中的类型.

例:

public IEdmModel GetEdmModel()
{
    EdmModel model = new EdmModel();

    EdmEntityContainer container = new EdmEntityContainer(Namespace, "DefaultContainer");
    model.AddElement(container);
    model.SetIsDefaultEntityContainer(container, isDefaultContainer: true);

    EdmEntityType edmType = new EdmEntityType(Namespace, "Foo");
    EdmStructuralProperty idProp = edmType.AddStructuralProperty("Id", EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Int32), false);
    edmType.AddKeys(idProp);

    ?ontainer.AddEntitySet("MyEntitySet", edmType);

    model.SetDataServiceVersion(new Version(3, 0, 0, 0));
    model.SetMaxDataServiceVersion(new Version(3, 0, 0, 0));

    return model;
}
Run Code Online (Sandbox Code Playgroud)