如何正确配置 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 识别为实体类型。