C# EF生成的SQL中的列名错误无效
下面您可以看到SQL应该使用[ClassId1]而不是[Class1\u ClassId]进行连接,因为后者不存在 我很确定我可以使用fluentapi来纠正这个问题,但不确定是什么方法 生成的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) 我相信,如果名称
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"
}
}