Asp.net web api 如何在ODataModelBuilder中定义多个模型类

Asp.net web api 如何在ODataModelBuilder中定义多个模型类,asp.net-web-api,odata,asp.net-web-api2,Asp.net Web Api,Odata,Asp.net Web Api2,我有一个使用ASP.NET Web API的OData v4端点,它有两个独立的模型 ModelVer1.Customer.cs int ID; string Name; int ID; string Name; string Address; ModelVer2.Customer.cs int ID; string Name; int ID; string Name; string Address; webapiconfig.cs public static void Regist

我有一个使用ASP.NET Web API的
OData v4端点,它有两个独立的模型

ModelVer1.Customer.cs

int ID;
string Name;
int ID;
string Name;
string Address;
ModelVer2.Customer.cs

int ID;
string Name;
int ID;
string Name;
string Address;
webapiconfig.cs

  public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
            ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<ModelVer1.Customer>("Customers");
          // If I use below get error:
          // The entity set 'Customers' was already configured with a different EntityType ('Customer'). Parameter name: entityType
            builder.EntitySet<ModelVer2.Customer>("Customers");


            config.MapODataServiceRoute(
                routeName: "ODataRoute",
                routePrefix: "demo/api",
                model: builder.GetEdmModel());


            config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector(config));


        }
公共静态无效寄存器(HttpConfiguration配置)
{
config.maphttpAttribute路由();
ODataModelBuilder=新ODataConventionModelBuilder();
建筑商实体集(“客户”);
//如果我使用下面的获取错误:
//实体集“Customers”已配置为其他EntityType(“Customer”)。参数名称:EntityType
建筑商实体集(“客户”);
config.MapODataServiceRoute(
routeName:“ODataRoute”,
routePrefix:“演示/api”,
模型:builder.GetEdmModel());
config.Services.Replace(typeof(IHttpControllerSelector),new CustomControllerSelector(config));
}
但是得到错误:

实体集“Customers”已配置了不同的 EntityType(“客户”)。 参数名称:entityType

应该怎么做

我想我需要做一些类似于
model:builder.GetEdmModel()
需要动态生成此模型,以获取所有实体模型 类,如ModelVersion1.Customer和ModelVersion2.Customer


您必须使用不同的别名/名称

而不是

builder.EntitySet<ModelVer1.Customer>("Customers");
builder.EntitySet<ModelVer2.Customer>("Customers");
builder.EntitySet(“客户”);
建筑商实体集(“客户”);
使用

builder.EntitySet(“客户”);
builder.EntitySet(“CustomerV2”);

它工作得很好奇怪为什么作为
客户v2
它只不过是名字对吗?它是如何指向
Customer
表的?我对odata有点陌生,请详细说明。URI中引用了别名,即:myDomain/Customers/。如果您使用相同的别名,则oData控制器不再知道需要对哪个实体执行操作或查询。是的,我在标头中传递版本号,mu自定义选择器执行路由,这就是名称不重要的原因,是吗?名称是我能给出的任何东西,但我的自定义选择器为我做路由选择,并且域模型已经正确定义,所以它可以工作,对吗?@Neo-根据我的理解,这是基于我过去一年在项目中如何实现oData。实体配置将添加到字典中,其中键是您传递的名称。然后,当您访问路由时,将访问该字典,默认约定是使用路由名称使用该字典查找正确的实体类型。我确实发现这篇文章非常有用,但可以避免一些常见的陷阱: