编辑子实体不会从表中删除旧行,它总是在实体框架ASP中添加新行.净MVC
本文关键字:实体 框架 添加 MVC 新行 ASP 编辑 删除 | 更新日期: 2023-09-27 18:13:35
我有一个教师实体,它有一个名为yogaclass的iccollection子实体。当我修改教师的YogaClass列表并保存时,实体框架将YogaClass的新行添加到表"YogaClass"中,但它不会删除或编辑旧行。所以我剩下了两倍的数据。我的repo中的"context.SaveChanges()"不应该足够聪明,知道删除已删除的类并添加新类(编辑),而不仅仅是添加新类?
在我的控制器中,我为Teacher编辑了这样的内容。
string userId = User.Identity.GetUserId();
Teacher teacher = teacherRepository.Find(userId);
//other code left out here
teacher.YogaClasses = GetSelectedClasses(Request.Form[2]);
// other stuff here
teacherRepository.Save();
在我的仓库里,我有这个;
public void Save()
{
context.SaveChanges();
}
这是我的老师和YogaClass实体
public class Teacher
{
public int TeacherId { get; set; }
public virtual ICollection<YogaClass> YogaClasses { get; set; }
}
public class YogaClass
{
public int YogaClassId { get; set; }
[Index]
[Required]
public int TeacherRefId { get; set; }
[ForeignKey("TeacherRefId")]
public virtual Teacher Teacher { get; set; }
}
这里的问题是在您设置teacher.YogaClasses
时关系尚未加载。因此,当您设置teacher.YogaClasses
时,它假定将添加新的关系。(在这种情况下,懒惰加载仍然有点晚)。解决方案是以某种方式确保首先加载所有关系(使用Include
或一些假访问首先触发惰性加载),然后正常设置新值:
//fake access to trigger lazy loading (of course this works only if
//lazy loading is enabled)
var someClasses = teacher.YogaClasses;
teacher.YogaClasses = GetSelectedClasses(Request.Form[2]);
你也可以用foreach循环清除旧类并添加新类:
teacher.YogaClasses.Clear();
foreach(var c in GetSelectedClasses(Request.Form[2])){
teacher.YogaClasses.Add(c);
}
我有一个不太好的解决方案,但似乎不是最好的。
在我将teacher上下文保存到我的repo之前我可以调用这个
public void DeleteYogaClasses(Teacher teacher)
{
foreach (var yogaClass in teacher.YogaClasses.ToList())
{
context.Entry(yogaClass).State = EntityState.Deleted;
}
context.SaveChanges();
}
您需要使用上下文的Attach
方法并传入您现有的teacher
对象,然后进行更改并调用SaveChanges
方法。从您的代码中不清楚您的上下文是什么,因此很难给出工作代码。这里有一个链接,解释如何添加/修改
你说你需要修改yogaclass,所以从这里我假设是一个教师对象已经有一些yogaclass条目,你想要更新其中的一些条目。你需要做的是,有一个需要修改的yogaClass的id列表然后在这个id列表上进行迭代在迭代循环中找到现有的yogaClass并将其附加到上下文中,修改它然后调用save changes(最好在所有更改完成后,这样不会影响性能)
这是一个suodocode
UpdateTeacher(int teacherId)
{
var teacher = teacherRepository.Find(teacherId);
UpdateYoga(teacher);
}
private void UpdateYoga(Teacher teacher)
{
foreach(var yoga in teacher.YogaClasses)
{
db.Context.Attach(yoga);
yoga.YogaStyle = whatEverValue;
}
db.context.SaveChanges();
}