我有一个现有的数据库,可以从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; }
答案 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; }
}