なぜか分らんけど動いた
SchoolContext.csのメソッドOnModelCreatingのコメントの行を書き直したら動くようになった。先日のエラーログから、ここがテーブル名になるのかなって感じでやってみた。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Course>().ToTable("Course"); modelBuilder.Entity<Enrollment>().ToTable("Enrollment"); modelBuilder.Entity<Student>().ToTable("Person"); // modified modelBuilder.Entity<Department>().ToTable("Department"); modelBuilder.Entity<Instructor>().ToTable("Person"); // modified modelBuilder.Entity<OfficeAssignment>().ToTable("OfficeAssignment"); modelBuilder.Entity<CourseAssignment>().ToTable("CourseAssignment"); modelBuilder.Entity<Person>().ToTable("Person"); modelBuilder.Entity<CourseAssignment>() .HasKey(c => new { c.CourseID, c.InstructorID }); }
こうすると、たとえば Student/Index にアクセスしたときに走るSQLは以下だそうだ。
SELECT [p].[ID] ,[p].[Discriminator] ,[p].[FirstName] ,[p].[LastName] ,[p].[EnrollmentDate] FROM [Person] AS [p] WHERE [p].[Discriminator] = N'Student' ORDER BY [p].[LastName] OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY
なにがどうなってWHERE句がちゃんと追加されてるんだろう。Person、Student、InstractorどのエンティティにもDiscriminatorなんてプロパティ無いけどPersonテーブルにはカラムがあるぞ?Table-per-Hierarchy (TPH) 継承を実現する為に、こうなるようになってるのかな?