0

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

这给我的错误是:“执行命令定义时发生错误。有关详细信息,请参阅内部异常。” 使用上面的代码时,当我查看包含已注册学生的学生字段的 CourseOfferings 时,它给了我错误:“现有连接被远程主机强行关闭”。当我调试我的代码时,我注意到它似乎出于某种原因正在寻找一个不存在的 dbo.Students1 表。经过进一步检查,我没有指定这一点,甚至在我的任何代码中都没有提到 Student1。为什么实体框架会查找 Student1 表而不是我的 Students 表?

4

1 回答 1

2

You are mapping your many-to-many table to a table named "Students" :

modelBuilder.Entity<CourseOffering>()
            .HasMany(x => x.Students)
            .WithMany(x => x.CourseOfferings)
            .Map(x =>
            {
               x.ToTable("Students");
               x.MapLeftKey("StudentId");
               x.MapRightKey("CourseOfferings");
            });

so when EF attempts to create the actual table "Students", it has to rename it to "Students1".

You might want to rename your many-to-many table to StudentsCourseOfferings to follow convention. This should create two tables in your database: StudentsCourseOfferings and Students

于 2013-06-17T18:04:54.827 回答