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

本文关键字:一个 不存在 框架 查找 实体 | 更新日期: 2023-09-27 18:18:41

在过去的几天里,我一直在努力解决这个问题,实体框架将寻找一个不存在的表。我也不知道它为什么会这样。我尝试用现有的数据库做一个代码优先的方法,它作为我所有网关的替代品,除了3。所有这三个都处理一个特定的POCO,叫做Student。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;
        }

给我的错误是:"执行命令定义时发生错误。当使用上述代码时,当我查看包含已注册学生的Students字段的CourseOfferings时,它会给我一个错误:"现有连接被远程主机强制关闭"。当我调试我的代码时,我注意到它似乎在寻找一个不存在的dbo。由于某种原因,学生们表。经过进一步的检查,我没有在任何地方的任何代码中指定它,甚至没有提到Students1。为什么实体框架寻找一个Students1表,而不是我的学生表?

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

您正在将您的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尝试创建实际的表"Students"时,它必须将其重命名为"Students1"。

您可能希望将many-to-many表重命名为StudentsCourseOfferings以遵循约定。这将在数据库中创建两个表:StudentsCourseOfferingsStudents

相关文章: