实体框架核心2.1无法正确翻译查询

时间:2018-07-21 10:08:40

标签: c# entity-framework asp.net-core entity-framework-core

我有一个现有的数据库,可以从2个单独的项目中访问一个数据库,一个ASP.NET MVC 5项目,以及一个使用各自的Entity Framework版本运行.NET Core 2.1的数据库。

我的问题是我在MVC项目上使用的查询在.NET Core项目上未正确翻译

我的2个模型如下,一个具有0个或更多工作单的工作:

public virtual DbSet<Job> Jobs { get; set; }
public virtual DbSet<WorkOrder> WorkOrders { get; set; }

public class Job
{
    public int JobId { get; set; }

    public ICollection<WorkOrder> WorkOrders { get; set; }

}

public class WorkOrder
{
    [Key]
    public int WorkOrderId { get; set; }

    public Job Job { get; set; }

}

我删除了所有不相关的字段。

在.NET核心项目中,我正在使用的查询非常简单:

await _context.WorkOrders
.Include(x => x.Job)
.ToListAsync();

但是这失败并显示以下错误:

  SELECT [x].[WorkOrderId], [x].[JobId], [x.Job].[JobId]
  FROM [WorkOrders] AS [x]
  LEFT JOIN [Jobs] AS [x.Job] ON [x].[JobId] = [x.Job].[JobId]

System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'JobId'.

如果我在数据库上运行此命令,它将失败,因为显然不是[x]。[JobId],因此EF感到困惑。我做错了什么?

更新

在数据库中,我的工作订单表有一个键Job_JobID,它是定义关系的键。我最初是在旧版ASP.NET 6项目上使用EF Code First创建表的。我在ASP.NET 6项目上使用迁移,但在.NET Core项目上不使用迁移。

我有以下流利的映射:

        modelBuilder.Entity<Job>()
                        .HasMany(x => x.WorkOrders)
                        .WithOptional(y => y.Job);

我尝试为两个关系添加虚拟关键字,但没有运气:

public virtual ICollection<WorkOrder> WorkOrders { get; set; }

public virtual Job Job { get; set; }

1 个答案:

答案 0 :(得分:1)

您需要将外键明确添加到WorkOrder类,因为它与EFCore约定不匹配:

public class WorkOrder
{
    [Key]
    public int WorkOrderId { get; set; }

    public int Job_JobID {get;set;} 

    [ForeignKey("Job_JobID")]
    public virtual Job Job { get; set; }

}