【发布时间】:2017-10-05 17:25:20
【问题描述】:
我正在使用 ASP.Net MVC 5、带有 SQL Server 的实体框架开发一个测试应用程序。
在我的场景中,数据库中有 2 个表。 Student 和 Qualification。
一名学生拥有一项或多项资格。
我需要通过提供 studentID 从数据库中获取student,并且Student(导航属性)的Qualification 列表应该包含他或她拥有的所有资格。
我实现的控制器方法如下。
public JsonResult getStudentInfo(int studentId)
{
db.Configuration.ProxyCreationEnabled = false;
Student ss = (Student) (from s in db.Students where s.Id == studentId select s).FirstOrDefault();
ss.Qualifications = (from q in db.Qualifications where q.StudentId == ss.Id select q).ToList();
return Json(ss, JsonRequestBehavior.AllowGet);
}
但是当我试图调用这个函数时,它会显示这个错误。
A circular reference was detected while serializing an object of type 'App1.Models.Student'.
如何解决此问题。
我需要通过Student 实例的完整资格列表。
我的学生模型类如下
public partial class Student
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Student()
{
this.Qualifications = new HashSet<Qualification>();
}
public int Id { get; set; }
public string Name { get; set; }
public Nullable<int> Age { get; set; }
public Nullable<byte> Gender { get; set; }
public string City { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Qualification> Qualifications { get; set; }
}
我的QualificationModel类如下
public partial class Qualification
{
public int Id { get; set; }
public Nullable<int> StudentId { get; set; }
public string QualificationName { get; set; }
public string Institute { get; set; }
public Nullable<System.DateTime> EffectiveDate { get; set; }
public virtual Student Student { get; set; }
}
上面的模型类是使用实体数据模型生成的。 我遵循数据库优先方法..
提前致谢。
【问题讨论】:
-
Qualification 类是什么样的?
-
@Robert 对不起。我刚刚更新了问题。
-
是的……我猜罗伯特猜对了;学生->资格->学生。是您的循环参考。过去,我编写代码将 Student.Qualification.Student 设置为 null,这样就不会发生这种情况。我确信有更好的解决方案。我不知道它是否能解决这个问题,但你可以试试这个库:github.com/zzzprojects/GraphDiff
-
我认为您可能不需要虚拟学生资格认证,尽管我可能是错的。如果您需要获取父学生,可以(从 db.Students 中的 s.Id ==qualification.StudentId select s).FirstOrDefault();或类似的
-
或者只是创建一个 public Student { get { return Student.GetById(this.StudentId); }} 或类似的东西
标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4