![](/img/trans.png)
[英]Update entity on db with a property of list of entities with one-to-many relationship
[英]List of entities not remembering previously added entities for a one-to-many relationship
我有两个实体,一个是一个班级,另一个是学生,我在班级实体中有一个注册学生的列表。 我遇到的问题是,在我将一名学生添加到 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();
// 在这里做一些其他的stuff然后添加学生
event.RegisteredStudents.Add(student);
dbContext.SaveChanges();
添加单个学生并尝试添加第二个后,当我将鼠标悬停在 RegisteredStudents 上时,它是空的!
正如您的标题所暗示的一对多关系,所以我假设您的学生类如下所示
public class Student
{
public Student() {}
public int Name{ get; set; }
public DateTime Time{ get; set; }
// other properties
public string EventId {get;set;}
public virtual Event Event {get; set; }
}
首先确保您的实体直接从数据库上下文中正确加载。 关于加载实体的一些信息
延迟加载是在第一次访问引用实体或实体的属性时自动从数据库加载实体或实体集合的过程。 使用 POCO 实体类型时,通过创建派生代理类型的实例,然后覆盖虚拟属性以添加加载钩子来实现延迟加载。 MSDN 参考
您可以尝试以下方法来正确地将学生添加到活动中
1) 学生对象中的更新事件
student.Event = event; //add this line here
event.RegisteredStudents.Add(student);
dbContext.SaveChanges();
2) 更新学生表中的外键
student.EventId = event.Id; //or add this line
event.RegisteredStudents.Add(student);
dbContext.SaveChanges();
3)检查事件的状态并相应地更新它
var state = dbContext.Entry(event).State;
if(state == EntityState.Detached)
dbContext.Events.Attach(event);
dbContext.Entry(event).State = EntityState.Modified;
如果您仍然遇到任何问题,我建议您在此处阅读有关加载相关实体的更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.