我有两个实体,一个用于学生的另一个班级,我有一个在班级实体中注册学生的列表。我遇到的问题是,在我将一名学生添加到RegisteredStudents列表然后注销并以另一名学生的身份重新登录并尝试注册另一名学生之后,RegisteredStudents列表为空!它不记得以前添加的学生。
仅供参考 - 这是EF 6 +,ASP.Net MVC
这是我的代码。
包含子项列表的父实体
public class Event
{
public Event() {
RegisteredStudents = new List<Student> ();
}
public int Name{ get; set; }
public DateTime Time{ get; set; }
// other properties
public List<Student> RegisteredStudents { get; set; }
}
正在添加到父
列表中的子实体public class Student
{
public Student() {}
public int Name{ get; set; }
public DateTime Time{ get; set; }
// other properties
}
以下是我添加新学生实体的方法。我得到一个活动和学生
然后我添加了学生。这是在服务类方法中完成的,因此如果我以新学员身份登录,那么它将是同一个事件,但是不同的学生。无论哪种方式,在添加第一个学生并保存上下文后,列表为空。
var student= dbContext.Profiles.Where(i => i.ApplicationUserGuid == userId).First();
var event = dbContext.SpaceEvents.Where(j => j.SpaceEventId == eventId).First();
//在这里做一些其他的麻烦然后添加学生
event.RegisteredStudents.Add(student);
dbContext.SaveChanges();
当我在添加一名学生并立即尝试添加第二名学生后将鼠标悬停在RegisteredStudents上时,它是空的!
答案 0 :(得分:0)
由于你的标题暗示了它的一对多关系所以我认为你的学生课程如下所示
student.Event = event; //add this line here
event.RegisteredStudents.Add(student);
dbContext.SaveChanges();
首先确保直接从db上下文正确加载实体。有关加载实体的一些信息
延迟加载是实体或集合的过程 第一次从数据库自动加载实体 访问涉及实体/实体的属性。使用时 POCO实体类型,延迟加载是通过创建实例来实现的 派生代理类型,然后覆盖虚拟属性以添加 装钩。 MSDN Reference
您可以尝试以下方法将学生正确添加到活动中
1)更新学生对象中的事件
student.EventId = event.Id; //or add this line
event.RegisteredStudents.Add(student);
dbContext.SaveChanges();
2)更新学生表中的外键
var state = dbContext.Entry(event).State;
if(state == EntityState.Detached)
dbContext.Events.Attach(event);
dbContext.Entry(event).State = EntityState.Modified;
3)检查事件的状态并相应地更新
SELECT Customer FROM MyTable WHERE Time='2013-07-01 02:00:00'
AND Consumption=(SELECT MAX(consumption) FROM MyTable);
如果您仍然遇到任何问题,我建议您阅读有关加载相关实体here的更多信息