c# - EF 生成的 SQL 出现无效列名错误

标签 c# sql entity-framework ef-fluent-api

在下面您可以看到 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; }

您尚未在这些属性之间设置任何关系。由于您尚未为 Class1Class2 定义外键列,因此它会为您创建它们:Class1_ClassIdClass2_ClassId。创建迁移应该为您创建这些列;但最终会得到重复项(例如 Class1IdClass1_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/

相关文章:

mysql - SQL查询选择语句

c# - 如何在C#中将声波转换为midi?

c# - 将 IEnumerable.Aggregate 与异步调用结合使用

c# - 使用 Critieria API 在 NHibernate 中选择子查询

php - 有没有办法在 SQL 查询中用变量表示列名?

c# - 无法翻译 LINQ 表达式错误

entity-framework - DbSet.Add(entity) 和 entity.State = EntityState.Added 之间的区别

c# - System.Web.Routing.RouteCollection 和 System.Web.Mvc.RouteCollectionExtensions 都具有相同的简单名称 'IgnoreRouteInternal'

c# - 扩展 ASP.NET WebControls : How to effectively hide public properties

c# - Ria 服务接口(interface)的替代方案