编辑子实体不会从表中删除旧行,它总是在实体框架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; }
}

编辑子实体不会从表中删除旧行,它总是在实体框架ASP中添加新行.净MVC

这里的问题是在您设置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();
    }