实体框架正在查找不存在的表

时间:2013-06-17 17:21:12

标签: c# entity-framework ef-code-first

在过去的几天里,我一直在努力解决这个问题,其中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表?

1 个答案:

答案 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以遵循惯例。这应该在您的数据库中创建两个表:StudentsCourseOfferingsStudents