在过去的几天里,我一直在努力解决这个问题,其中Entity框架会寻找一个不存在的表。我不知道为什么它也会这样做。我试图用现有的数据库做一个代码优先的方法,并且除了3之外,它完全可以替代我的所有网关。所有这3个处理这个特殊的POCO称为学生。 POCO课程如下:
public class Student
{
public Guid StudentId { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String Grade { get; set; }
public virtual ICollection<CourseOffering> CourseOfferings { get; set; }
}
我的上下文文件是:
class GatewayContext : DbContext
{
public DbSet<Course> Course { get; set; }
public DbSet<CourseType> CourseTypes { get; set; }
public DbSet<CourseOffering> CourseOfferings { get; set; }
public DbSet<Staff> Staff { get; set; }
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<CourseOffering>()
.HasMany(x => x.Students)
.WithMany(x => x.CourseOfferings)
.Map(x =>
{
x.ToTable("Students");
x.MapLeftKey("StudentId");
x.MapRightKey("CourseOfferings");
});
}
}
我使用这些代码在网关中调用的代码是:
try
{
GatewayContext context = new GatewayContext();
var students = from p in context.Students
select p;
var studentList = new List<Services.Proxy.TransferObjects.Student>();
foreach (var student in students)
{
studentList.Add(student);
}
return studentList;
}
catch (Exception ex)
{
throw;
}
这给我的错误是:&#34;执行命令定义时发生错误。有关详细信息,请参阅内部异常。&#34;当使用上面的代码时,当我查看包含学生字段的CourseOfferings时,它给了我错误:&#34;现有连接被远程主机强行关闭&#34;。当我调试我的代码时,我注意到它出于某种原因似乎在寻找一个不存在的dbo.Students1表。经过进一步检查,我没有在任何地方指定这个,甚至在我的任何代码中提及Students1。为什么Entity Framework会查找Students1表而不是我的Students表?
答案 0 :(得分:2)
您正在将many-to-many
表映射到名为“Students”的表:
modelBuilder.Entity<CourseOffering>()
.HasMany(x => x.Students)
.WithMany(x => x.CourseOfferings)
.Map(x =>
{
x.ToTable("Students");
x.MapLeftKey("StudentId");
x.MapRightKey("CourseOfferings");
});
所以当EF尝试创建实际的表“学生”时,它必须将其重命名为“Students1”。
您可能希望将many-to-many
表重命名为StudentsCourseOfferings
以遵循惯例。这应该在您的数据库中创建两个表:StudentsCourseOfferings
和Students