【发布时间】:2018-12-29 12:02:03
【问题描述】:
我有一个现有的数据库,我从 2 个单独的项目中访问它,一个是 ASP.NET MVC 5 项目,另一个是运行 .NET Core 2.1 的项目,每个项目都使用各自的 Entity Framework 版本。
我的问题是我在 MVC 项目上使用的查询在 .NET Core 项目上被错误地翻译
我的 2 个模型如下,一个 Job 有 0 个或多个 Workorders:
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 变得很困惑。我做错了什么?
更新
在数据库中,我的 workorders 表有一个键 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; }
【问题讨论】:
-
实体在数据库级别是如何关联的?
-
一个工作对应多个工作订单。我最初使用 asp.net 项目使用 ef 6 生成代码优先数据库。相同的查询在旧的 Aspnet 项目上没有问题
-
抱歉,您能说得更准确些吗?也许可以给出架构?对于这种关系,我希望 WorkOrder 表包含一个链接到 Job 表的外键。
-
在类中将关系属性设置为虚拟
-
这两个版本中的任何一个是否通过迁移来控制数据库架构?数据库中FK字段的名称是什么?
标签: c# entity-framework asp.net-core entity-framework-core