Models如下:
public class Student
{
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public string FirstMidName { get; set; }
public string LastName { get; set; }
public int StudentID { get; set; }
}
public class Course
{
public int CourseID { get; set; }
public int Credits { get; set; }
public virtual Enrollment Enrollments { get; set; }
public string Title { get; set; }
}
public class Enrollment
{
public int CourseID { get; set; }
public virtual Course Course { get; set; }
public int EnrollmentID { get; set; }
public decimal? Grade { get; set; }
public virtual Student Student { get; set; }
public int StudentID { get; set; }
}
DbContext如下:
public class SchoolDbContext : DbContext
{
public readonly static string connectionStr = ConfigurationManager.ConnectionStrings["MySchool"].ConnectionString.Trim();
public SchoolDbContext()
: base(connectionStr)
{ }
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
//base.OnModelCreating(modelBuilder);
}
}
在页面呈现学生的信息,Controllers如下:
public class SchoolController : Controller
{
//
// GET: /School/
SchoolDbContext db = new SchoolDbContext();
public ActionResult Index()
{
var s = from t in db.Students
select t;
return View(s.ToList());
}
}
运行的时候,一直在var s = from t in db.Students select t 报错,错误信息如下:
Unable to determine the principal end of an association between the types 'MyMVCStudy.Models.Course' and 'MyMVCStudy.Models.Enrollment'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.
后来在网上搜到一个解决方案,还是因为Model之前的关系没有处理好,改SchoolDbContext类如下:
public class SchoolDbContext : DbContext
{
public readonly static string connectionStr = ConfigurationManager.ConnectionStrings["MySchool"].ConnectionString.Trim();
public SchoolDbContext()
: base(connectionStr)
{ }
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Entity<Student>().HasRequired(p => p.Enrollments).WithOptional();
modelBuilder.Entity<Course>().HasRequired(p => p.Enrollments).WithOptional();
modelBuilder.Entity<Enrollment>().HasRequired(p => p.Student).WithOptional();
modelBuilder.Entity<Enrollment>().HasRequired(p => p.Course).WithOptional();
//base.OnModelCreating(modelBuilder);
}
}
问题解决!