在ODATA的$metadata上设置命名空间

4

我希望更改我ODATA服务中所有实体的命名空间。

现在它们是: Core.DomainModel.Entities.Database,当使用时有点冗长。

我尝试通过builder.Namespace = "MyModel";进行设置,但没有效果。

var builder = new ODataConventionModelBuilder();
builder.Namespace = "MyModel";

我后来想到必须对每个实体进行设置,如下所示。
builder.EntitySet<Foo>("Foo").EntityType.Namespace = "MyModel";

但当我不得不遍历每一个实体时,这很快就会失控 :(
然后我尝试了这个。
foreach (var entity in builder.EntitySets)
{
    entity.EntityType.Namespace = "MyModel";
}

但这还不包括所有内容。我注意到枚举、复杂类型和一些实体没有得到正确的命名空间... :/
因此,我的问题是:如何为每个实体设置命名空间?
2个回答

3
一种解决方案是从ODataConventionModelBuilder派生一个新类,然后实现一些重写。
public class ODataExtendedConventionModelBuilder : ODataConventionModelBuilder

    public override ComplexTypeConfiguration AddComplexType(Type type)
    {
        var x = base.AddComplexType(type);
        x.Namespace = Namespace;
        return x;
    }

    public override EntityTypeConfiguration AddEntityType(Type type)
    {
        var x = base.AddEntityType(type);
        x.Namespace = Namespace;
        return x;
    }

    public override EnumTypeConfiguration AddEnumType(Type type)
    {
        var x = base.AddEnumType(type);
        x.Namespace = Namespace;
        return x;
    }

    public override void AddProcedure(ProcedureConfiguration procedure)
    {
        procedure.Namespace = Namespace;
        base.AddProcedure(procedure);
    }
}

在这个例子中,我使用了ODataModelBuilder.Namespace属性来确定为每个实体配置什么命名空间。但是你可以采用各种方法来确定要使用的命名空间。

1

你在为每个实体设置命名空间的做法是正确的,builder.Namespace 是容器命名空间,而不是每个实体的命名空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接