EF5/Code First relations work at database level but not in the assembly
I'm transitioning from nHibernate to EF5 and am having problems with
mapping relations. Working with a conventional one-to-many relation let's
call it Instructor/Course:
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);
}
}
}
The above is the POCO generated by the Reverse Engineer tool where I've
used as a starting point, the db that nHibernate's been using for the last
few years. For the most part things lined up really well. After minor
adjustments for PKey names I've been able to seed the new db with
nHibernate's data and the same joins are working against both dbs.
E.G. this works the same returns correct values:
SELECT C.Title, C.Id, C.InstructorId, I.Id
FROM dbo.Course C
INNER JOIN dbo.Instructor I ON I.Id = C.InstructorId
...
And even within the assembly, this linq query pulls correctly against the
db: var query = from Course in _ctx.Courses where Course.Instructor.Id ==
InstructorId select Course;
So I must have lots of the ducks lined up correctly. However, when
attempting to access the Instructor entity from _within the Course entity,
as is typical at the View:
@foreach (var course in Model)
{
<div>@course.Title - Instructor.ID is all zeros: @course.Instructor.Id
- FK is correct: @course.InstructorId</div>
}
outputs:
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
and so on for all courses.
No comments:
Post a Comment