nHibernate から EF5 に移行していますが、関係のマッピングに問題があります。従来の 1 対多の関係で作業することを、インストラクター/コースと呼びましょう。
public class Course
{
public Course()
{
Instructor = new Instructor();
CourseFiles = new List<CourseFile>();
}
public int Id { get; set; }
public string Description { get; set; }
public string Title { get; set; }
public int InstructorId { get; set; }
public virtual Instructor Instructor { get; set; }
public virtual ICollection<CourseFile> CourseFiles { get; set; }
}
public class CourseMap : EntityTypeConfiguration<Course>
{
public CourseMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Description)
.IsRequired();
this.Property(t => t.Title)
.IsRequired()
.HasMaxLength(125);
// Table & Column Mappings
this.ToTable("Course");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Description).HasColumnName("Description");
this.Property(t => t.Title).HasColumnName("Title");
this.Property(t => t.InstructorId).HasColumnName("InstructorId");
// Relationships
this.HasRequired(t => t.Instructor)
.WithMany(t => t.Courses)
.HasForeignKey(d => d.InstructorId);
}
}
public partial class Instructor
{
public Instructor()
{
this.Courses = new List<Course>();
}
public int Id { get; set; }
public string Biography { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class InstructorMap : EntityTypeConfiguration<Instructor>
{
public InstructorMap()
{
// Primary Key
this.HasKey(t => t.Id);
this.Property(t => t.Biography)
.HasMaxLength(140);
// Table & Column Mappings
this.ToTable("Instructor");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Biography).HasColumnName("Biography");
//the mapping of this relation _has to be where the problem is
// really seems like this should create the required plumbing but no joy
this.HasMany(w => w.Webinars)
.WithRequired()
.HasForeignKey(w => w.PresenterId);
}
}
}
上記は、nHibernate がここ数年使用しているデータベースを出発点として使用したリバース エンジニア ツールによって生成された POCO です。ほとんどの場合、物事は本当にうまく並んでいました。PKey 名を微調整した後、新しいデータベースに nHibernate のデータをシードすることができ、同じ結合が両方のデータベースに対して機能しています。
EG これは同じように機能し、正しい値を返します。
SELECT C.Title, C.Id, C.InstructorId, I.Id
FROM dbo.Course C
INNER JOIN dbo.Instructor I ON I.Id = C.InstructorId
...
アセンブリ内でも、この linq クエリはデータベースに対して正しくプルします。
var query = from Course in _ctx.Courses
where Course.Instructor.Id == InstructorId
select Course;
だから、たくさんのアヒルを正しく並べなければなりません。ただし、ビューで一般的であるように、_within the Course エンティティから Instructor エンティティにアクセスしようとすると、次のようになります。
@foreach (var course in Model)
{
<div>@course.Title - Instructor.ID is all zeros: @course.Instructor.Id - FK is correct: @course.InstructorId</div>
}
出力:
My Correct Course Title - Instructor.ID is all zeros: 0 - FK is correct: 555
Title From Diff Instructor - Instructor.ID is all zeros: 0 - FK is correct: 333
など、すべてのコースに適用されます。
私は何かを処分するための明示的な行動をとっていません。ビュー内の ForEach の先頭にブレークポイントを設定しましたが、[ローカル] ウィンドウに「 context 」が表示されません。Controller 内の Instructor ノード (コンテキスト) を分割すると、最初の 10 行を除いてすべて適切にシードされた、データベース内のすべてのプレゼンターの行が表示されます (リポジトリは「.Take(10)」を使用しています。これらの最初の 10 行の Presenter 行 (Presenter 内) |Local) はすべてゼロになっているので、明らかに、POCO のコンストラクターに問題があります。