在下面您可以看到 SQL 应使用 [ClassId1] 而不是 [Class1_ClassId] 进行连接,因为后者不存在。
我很确定我可以使用 Fluent API 来纠正这个问题,但不确定用什么方法。
生成的 SQL
SELECT ...
FROM [dbo].[School] AS [Extent1]
LEFT OUTER JOIN [dbo].[Student] AS [Extent2] ON [Extent1].[SchoolId] = [Extent2].[SchoolId]
LEFT OUTER JOIN [dbo].[Class] AS [Extent3] ON [Extent2].[Class1_ClassId] = [Extent3].[ClassId]
LEFT OUTER JOIN [dbo].[Class] AS [Extent4] ON [Extent2].[Class2_ClassId] = [Extent4].[ClassId]
WHERE ...
表格
School
- SchoolId
- Name
- StudentId
Student
- StudentId
- Name
- Class1Id
- Class2Id
Class
- ClassId
- Name
模型
public class School
{
[Required]
public long SchoolId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public long StudentId { get; set; }
public virtual Student Student { get; set; }
}
public class Student
{
[Required]
public long StudentId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public long ClassId1 { get; set; }
public long? ClassId2 { get; set; }
public virtual Class Class1 { get; set; }
public virtual Class Class2 { get; set; }
}
public class Class
{
[Required]
public long ClassId { get; set; }
[Required]
public string Name { get; set; }
}
最佳答案
[Required]
public long ClassId1 { get; set; }
public long? ClassId2 { get; set; }
public virtual Class Class1 { get; set; }
public virtual Class Class2 { get; set; }
您尚未在这些属性之间设置任何关系。由于您尚未为 Class1
或 Class2
定义外键列,因此它会为您创建它们:Class1_ClassId
和 Class2_ClassId
。创建迁移应该为您创建这些列;但最终会得到重复项(例如 Class1Id
和 Class1_ClassId
)。
我相信如果名称以Id
结尾,EntityFramework将解析属性之间的关系。这意味着您的设置应该是:
[Required]
public long Class1Id { get; set; }
public long? Class2Id { get; set; }
public virtual Class Class1 { get; set; }
public virtual Class Class2 { get; set; }
但是,我发现最好是明确的 - 纯粹是为了可读性并确保 EF 不会试图变得太聪明。我会这样写:
[Required]
public long ClassId1 { get; set; }
public long? ClassId2 { get; set; }
[ForeignKey("ClassId1")]
public virtual Class Class1 { get; set; }
[ForeignKey("ClassId2")]
public virtual Class Class2 { get; set; }
这应该在数据库中正确设置您的外键关系。
关于c# - EF 生成的 SQL 出现无效列名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45069836/