C# EF生成的SQL中的列名错误无效

C# EF生成的SQL中的列名错误无效,c#,sql,entity-framework,ef-fluent-api,C#,Sql,Entity Framework,Ef Fluent Api,下面您可以看到SQL应该使用[ClassId1]而不是[Class1\u ClassId]进行连接,因为后者不存在 我很确定我可以使用fluentapi来纠正这个问题,但不确定是什么方法 生成的SQL 桌子 模型 您尚未在这些属性之间设置任何关系。由于您尚未为Class1或Class2定义外键列,它将为您创建它们:Class1\u ClassId和Class2\u ClassId。创建迁移应该为您创建这些列;但最终会出现重复项(ClassId和Class1\u ClassId) 我相信,如果名称

下面您可以看到SQL应该使用[ClassId1]而不是[Class1\u ClassId]进行连接,因为后者不存在

我很确定我可以使用fluentapi来纠正这个问题,但不确定是什么方法

生成的SQL

桌子

模型

您尚未在这些属性之间设置任何关系。由于您尚未为
Class1
Class2
定义外键列,它将为您创建它们:
Class1\u ClassId
Class2\u ClassId
。创建迁移应该为您创建这些列;但最终会出现重复项(
ClassId
Class1\u 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; }

这将正确地设置数据库中的外键关系。

我认为实体框架是从linq构建此SQL的,因为模型中的类之间的关系不清楚

根据您的模型,a
学校只有一名
学生
,a
学生
不知道他在哪个
学校
,必须上一节
课,可能还有第二节课。一个
班级
不知道它在哪个
学校
,也不知道哪个
学生
班级

您确定您的型号吗?

我想一所
学校
可能会有零个或更多的
学生
学校也有零个或多个
班级
。每个
班级
都是
学校的一个班级

就数据库而言,这是一种典型的一对多关系。看

此外,
学生
参加零个或多个
课程
,一个
课程
有一个或多个
学生

就数据库而言,这是一种典型的多对多关系。见:

这些文章也描述了学校、学生和亲戚。概括而言,类别定义应为:

class School
{
    public int Id {get; set;}

    // a School has many Students:
    public virtual ICollection<Student> Students {get; set;}
    // a School has many Classes:
    public virtual ICollection<Class> Classes {get; set;}
    ...
}

public class Student
{
    public int Id {get; set;}

    // A student belongs to one School via Foreign Key
    public int SchoolId {get; set;}
    public virtual School School {get; set;}

    // A student attends many classes
    public virtual ICollection<Class> Classes {get; set;}
    ...
}

class Class
{
    public int Id {get; set;}

    // a class belongs to one School via foreign key:
    public int SchoolId {get; set;}
    public virtual School School {get; set;}

    // a class has many Students
    public virtual ICollection<Student> Students {get; set;}
    ...
}

正是我错过的!感谢您的帮助和快速响应。最后一个跟进问题:我猜我在其他虚拟属性上不需要这些,因为EF能够自己找到它们?@user3953989这取决于您如何设置其他属性。我相信认识到
ForeignRow
ForeignRowId
是相互关联的是足够明智的;但老实说,我已经有一段时间没有和英孚合作了,而且对确切的规则还不确定。我倾向于在所有外键上都是显式的,不管EF是否能自动计算出来。
[Required]
public long ClassId1 { get; set; }

public long? ClassId2 { get; set; }

public virtual Class Class1 { get; set; }
public virtual Class Class2 { get; set; }
[Required]
public long Class1Id { get; set; }

public long? Class2Id { get; set; }

public virtual Class Class1 { get; set; }
public virtual Class Class2 { get; set; }
[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; }
class School
{
    public int Id {get; set;}

    // a School has many Students:
    public virtual ICollection<Student> Students {get; set;}
    // a School has many Classes:
    public virtual ICollection<Class> Classes {get; set;}
    ...
}

public class Student
{
    public int Id {get; set;}

    // A student belongs to one School via Foreign Key
    public int SchoolId {get; set;}
    public virtual School School {get; set;}

    // A student attends many classes
    public virtual ICollection<Class> Classes {get; set;}
    ...
}

class Class
{
    public int Id {get; set;}

    // a class belongs to one School via foreign key:
    public int SchoolId {get; set;}
    public virtual School School {get; set;}

    // a class has many Students
    public virtual ICollection<Student> Students {get; set;}
    ...
}
class MyDbContext : DbContext
{
    public DbSet<School> Schools {get; set;}
    public DbSet<Student> Students {get; set;}
    public DbSet<Class> Classes {get; set;}
}
 class MyDbContext : DbContext
{
    public DbSet<School> Schools {get; set;}
    public DbSet<Student> Students {get; set;}
    public DbSet<Class> Classes {get; set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Entity Class should be put in table Classes
        modelBuilder.Entity<Class>().ToTable("Classes");

        // property Student.ClassId in column "ClassId1"
        modelBuilder.Entity<Student>()               // from class Student
            .Property(student => student.ClassId)    // take property ClassId
            .HasColumnName("ClassId1");              // give it the column name "ClassId1"

    }
}