0

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 のコンストラクターに問題があります。

4

0 に答える 0