如何正确配置 ODataModelBuilder 以避免与模型对象的虚拟属性发生冲突
how to properly configure ODataModelBuilder to avoid conflict with virtual properties of model objects
我正在使用 Db Context 构建一个自托管的 WebAPI 2 OData 4 服务,它是从现有数据库反向工程而来的。
上下文如下所示:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using CommonDataService.Models.Mapping;
namespace CommonDataService.Models
{
public partial class MALContext : DbContext
{
static MALContext()
{
Database.SetInitializer<MALContext>(null);
}
public MALContext()
: base("Name=MALContext")
{
}
public DbSet<AccountAlia> AccountAlias { get; set; }
public DbSet<AccountProgram> AccountPrograms { get; set; }
public DbSet<AccountRolePerson> AccountRolePersons { get; set; }
public DbSet<Account> Accounts { get; set; }
public DbSet<ChangeMeasure> ChangeMeasures { get; set; }
public DbSet<Country> Countries { get; set; }
public DbSet<Industry> Industries { get; set; }
public DbSet<Offering> Offerings { get; set; }
public DbSet<Person> People { get; set; }
public DbSet<Program> Programs { get; set; }
public DbSet<RegionAlia> RegionAlias { get; set; }
public DbSet<Region> Regions { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Service> Services { get; set; }
public DbSet<Tool> Tools { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new AccountAliaMap());
modelBuilder.Configurations.Add(new AccountProgramMap());
modelBuilder.Configurations.Add(new AccountRolePersonMap());
modelBuilder.Configurations.Add(new AccountMap());
modelBuilder.Configurations.Add(new ChangeMeasureMap());
modelBuilder.Configurations.Add(new CountryMap());
modelBuilder.Configurations.Add(new IndustryMap());
modelBuilder.Configurations.Add(new OfferingMap());
modelBuilder.Configurations.Add(new PersonMap());
modelBuilder.Configurations.Add(new ProgramMap());
modelBuilder.Configurations.Add(new RegionAliaMap());
modelBuilder.Configurations.Add(new RegionMap());
modelBuilder.Configurations.Add(new RoleMap());
modelBuilder.Configurations.Add(new ServiceMap());
modelBuilder.Configurations.Add(new ToolMap());
}
}
}
在我的 startup.cs class 中,我按以下方式配置我的 ODataModelBuilder:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<ChangeMeasure>("ChangeMeasure");
builder.EntitySet<Account>("Account");
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: null,
model: builder.GetEdmModel());
我的一个模型 classes "AccountAlia" 看起来像这样:
using System;
using System.Collections.Generic;
namespace CommonDataService.Models
{
public partial class AccountAlia
{
public int AccountAlilasID { get; set; }
public string AliasName { get; set; }
public string SourceSystem { get; set; }
public string SourceColumn { get; set; }
public string SourceValue { get; set; }
public Nullable<int> Account_ID { get; set; }
public virtual Account Account { get; set; }
}
}
当我尝试 运行 我的程序时,出现以下错误:
An exception of type 'System.InvalidOperationException'
occurred in System.Web.OData.dll but was not handled in user code
Additional information: The complex type 'CommonDataService.Models.AccountAlia'
refers to the entity type 'CommonDataService.Models.Account'
through the property 'Account'.
避免此类冲突的正确方法是什么?
报错信息给出了线索:复杂类型 'X'指的是实体类型 'Y' .目前,OData for Web API does not support references to entity types from within complex types. See .
但在我看来,您希望 AccountAlia
成为实体类型。存在阻止 ODataConventionModelBuilder
识别 AccountAlia
的键 属性 的拼写错误。只需将 属性 AccountAlilasID
重命名为 AccountAliaID
,基于约定的模型构建器就会将 AccountAlia
识别为实体类型。
我正在使用 Db Context 构建一个自托管的 WebAPI 2 OData 4 服务,它是从现有数据库反向工程而来的。 上下文如下所示:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using CommonDataService.Models.Mapping;
namespace CommonDataService.Models
{
public partial class MALContext : DbContext
{
static MALContext()
{
Database.SetInitializer<MALContext>(null);
}
public MALContext()
: base("Name=MALContext")
{
}
public DbSet<AccountAlia> AccountAlias { get; set; }
public DbSet<AccountProgram> AccountPrograms { get; set; }
public DbSet<AccountRolePerson> AccountRolePersons { get; set; }
public DbSet<Account> Accounts { get; set; }
public DbSet<ChangeMeasure> ChangeMeasures { get; set; }
public DbSet<Country> Countries { get; set; }
public DbSet<Industry> Industries { get; set; }
public DbSet<Offering> Offerings { get; set; }
public DbSet<Person> People { get; set; }
public DbSet<Program> Programs { get; set; }
public DbSet<RegionAlia> RegionAlias { get; set; }
public DbSet<Region> Regions { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Service> Services { get; set; }
public DbSet<Tool> Tools { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new AccountAliaMap());
modelBuilder.Configurations.Add(new AccountProgramMap());
modelBuilder.Configurations.Add(new AccountRolePersonMap());
modelBuilder.Configurations.Add(new AccountMap());
modelBuilder.Configurations.Add(new ChangeMeasureMap());
modelBuilder.Configurations.Add(new CountryMap());
modelBuilder.Configurations.Add(new IndustryMap());
modelBuilder.Configurations.Add(new OfferingMap());
modelBuilder.Configurations.Add(new PersonMap());
modelBuilder.Configurations.Add(new ProgramMap());
modelBuilder.Configurations.Add(new RegionAliaMap());
modelBuilder.Configurations.Add(new RegionMap());
modelBuilder.Configurations.Add(new RoleMap());
modelBuilder.Configurations.Add(new ServiceMap());
modelBuilder.Configurations.Add(new ToolMap());
}
}
}
在我的 startup.cs class 中,我按以下方式配置我的 ODataModelBuilder:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<ChangeMeasure>("ChangeMeasure");
builder.EntitySet<Account>("Account");
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: null,
model: builder.GetEdmModel());
我的一个模型 classes "AccountAlia" 看起来像这样:
using System;
using System.Collections.Generic;
namespace CommonDataService.Models
{
public partial class AccountAlia
{
public int AccountAlilasID { get; set; }
public string AliasName { get; set; }
public string SourceSystem { get; set; }
public string SourceColumn { get; set; }
public string SourceValue { get; set; }
public Nullable<int> Account_ID { get; set; }
public virtual Account Account { get; set; }
}
}
当我尝试 运行 我的程序时,出现以下错误:
An exception of type 'System.InvalidOperationException'
occurred in System.Web.OData.dll but was not handled in user code
Additional information: The complex type 'CommonDataService.Models.AccountAlia'
refers to the entity type 'CommonDataService.Models.Account'
through the property 'Account'.
避免此类冲突的正确方法是什么?
报错信息给出了线索:复杂类型 'X'指的是实体类型 'Y' .目前,OData for Web API does not support references to entity types from within complex types. See
但在我看来,您希望 AccountAlia
成为实体类型。存在阻止 ODataConventionModelBuilder
识别 AccountAlia
的键 属性 的拼写错误。只需将 属性 AccountAlilasID
重命名为 AccountAliaID
,基于约定的模型构建器就会将 AccountAlia
识别为实体类型。