1

我正在使用 OData V4、EF6 和 MySql 5.6/5.7 以及以下模型和表格。通过此调用 odata/Applications,我得到了 Application 资源的结果,但是当我扩展角色时出现此错误,如下 odata/Applications?$expand=roles。

错误:执行命令定义时发生错误。有关详细信息,请参阅内部异常。“where 子句”中的未知列“Project3.ApplicationId”

我知道这与映射有关,但我看不出是什么。

public class Role
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int ApplicationId { get; set; }

    //public virtual Application Application { get; set; }

}

public class Application
{
    public int Id { get; set; }

    public string Name { get; set; }

    public bool IsDeleted { get; set; }

    public virtual ICollection<Role> Roles { get; set; }

    public Application()
    {
        Roles = new List<Role>();
    }
}

public class ApplicationView
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<RoleView> Roles { get; set; }

    public ApplicationView()
    {
        Roles = new List<RoleView>();
    }
}

public class RoleView
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int ApplicationId { get; set; }

}

create table IF NOT EXISTS Application (
ApplicationId int not null auto_increment primary key,
Name varchar(255) not null,
IsDeleted bool not null default false,

CreatedBy varchar(255) not null,
CreatedOn Datetime not null,
UpdatedBy varchar(255) not null,
UpdatedOn DateTime not null

) 引擎=创新;

create table IF NOT EXISTS Role (
RoleId int not null auto_increment primary key,
Name varchar(255) not null,
ApplicationId int not null,

CreatedBy varchar(255) not null,
CreatedOn Datetime not null,
UpdatedBy varchar(255) not null,
UpdatedOn DateTime not null,

index app_index (ApplicationId),
foreign key (ApplicationId) references Application(ApplicationId) on delete cascade

) 引擎=创新;

这是 OData 操作方法。

[HttpGet]
    [ODataRoute("Applications")]
    public IQueryable<ApplicationView> Get()
    {
        var result = IdentityRepository.Applications
            .Include("Role")
            .ProjectTo<ApplicationView>();
        return result;
    }

映射类:

public class RoleMap : EntityTypeConfiguration<Role>
{
    public RoleMap()
    {
        ToTable("Role");

        HasKey(x => x.Id);
        Property(x => x.Id).HasColumnName("RoleId");

        // Tried with/without, no change.
        //HasRequired(x => x.Application).WithMany(x => x.Roles).HasForeignKey(x => x.ApplicationId);
    }
}

public class ApplicationMap : EntityTypeConfiguration<Application>
{
    public ApplicationMap()
    {
        ToTable("Application");

        HasKey(x => x.Id);
        Property(x => x.Id).HasColumnName("ApplicationId");

        // Tried with/without no change.
        HasMany(x => x.Roles).WithRequired().HasForeignKey(x => x.ApplicationId);
    }
}

我尝试了代码优先和数据库优先 edmx 的存储库,并不断收到相同的错误。

4

1 回答 1

0

EF 映射似乎是正确的。我的猜测是问题出在ProjectTo方法上。这似乎是 AutoMapper Queryable Extensions 的一部分。文档说(关于ProjectTo):

请注意,要使此功能起作用,必须在 Mapping 中显式处理所有类型转换。例如,您不能依赖 Item 类的 ToString() 覆盖来通知实体框架仅从 Name 列中进行选择,并且任何数据类型的更改,例如 Double 到 Decimal 也必须显式处理。

ProjectTo尝试用a替换您的查询Select,或直接删除它,以确认错误是否来自那里,或检查您的 AutoMapper 映射。

于 2016-11-11T18:26:28.727 回答