gpt4 book ai didi

c# - 尝试从 EF CodeFirst 更新对象时在多对多表中重复条目

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:05 25 4
gpt4 key购买 nike

这是我的两个模型类学生和类(class)

public class Student
{
private readonly IStudentOps _studentOps;

public Student(IStudentOps studentOps)
{
_studentOps = studentOps;
}
public int Id { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }

public Student()
{
Courses = new List<Course>();
}

public virtual IList<Course> Courses { get; set; }

public bool Enrol(Student student)
{
return _studentOps.EnrolOrUpdate(student);
}

public IEnumerable<Course> SeeCourses()
{
return _studentOps.SeeCourses();
}
}


public class Course
{
public int Id { get; set; }
public string Name { get; set; }

public virtual IList<Student> Students { get; set; }
}

这是我的学生类界面和服务

public interface IStudentOps
{
bool EnrolOrUpdate(Student student);
IEnumerable<Course> SeeCourses();
}


public class StudentOps : IStudentOps
{

public bool EnrolOrUpdate(Student student)
{
using (var context = new StudentContext())
{
if (student.Id == 0)
{
context.Students.Add(student);
context.SaveChanges();
return true;
}

var tempStudent = context.Students.FirstOrDefault(x => x.Id == student.Id);

// ReSharper disable once InvertIf
if (tempStudent == null) return false;
context.Students.Attach(tempStudent);
tempStudent.Id = student.Id;
tempStudent.Name = student.Name;
tempStudent.BirthDate = student.BirthDate;
tempStudent.Courses = student.Courses;
context.Entry(tempStudent).State = EntityState.Modified;
context.SaveChanges();
return true;
}
}

public IEnumerable<Course> SeeCourses()
{
return new List<Course>() { new Course() { Name = "Social" }, new Course() { Name = "Science" } };
}
}

上下文类

class StudentContext : DbContext
{
public StudentContext() :
base("Name=StudentConn")
{

}
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student> ().HasMany(c=>c.Courses).WithMany(x=>x.Students)
.Map(
m =>
{
m.MapLeftKey("StudentId");
m.MapRightKey("CourseId");
m.ToTable("Student_Course");
});

}
}

数据库中的数据

学生(表)
身份证姓名出生日期
21 佩德罗 2015-04-16 16:12:49.270
22 约翰 2015-04-14 16:12:49.270
23 希夫 2015-04-16 16:13:45.240

类(class)(表格)
身份证名称
26 科学
27 地理学
28 测试类(class)
29 空

Student_Course(表格)
学生 ID 类(class) ID
23 28
23 29

使用 StudentOps 表中的代码,我正在尝试将名为 Shiv 的学生更新为具有类(class) 26(科学)和 27(地理)而不是 28(TestCourse)和 29(NUll)(在多对多表中)Student_Course。但每次我这样做时,它都会在表中插入重复条目而不是更新它。从代码更新 Student_Course 表的最佳方法是什么?有人要帮忙吗?提前致谢

最佳答案

要更新多对多关系中的实体是 EF ,您需要执行以下操作:

  1. 将实体附加到上下文
  2. 确保您要更改的集合已加载
  3. 确保加载为跟踪实体。
  4. 调用 EF 的 .SaveChanges() 来保存更改。

在你的情况下你应该做这样的事情:

public bool EnrolOrUpdate(Student student)
{
using (var context = new StudentContext())
{
if (student.Id == 0)
{
context.Students.Add(student);
context.SaveChanges();
return true;
}

var tempStudent = context.Students.FirstOrDefault(x => x.Id == student.Id);

// ReSharper disable once InvertIf
if (tempStudent == null) return false;
context.Students.Attach(tempStudent);
tempStudent.Id = student.Id;
tempStudent.Name = student.Name;
tempStudent.BirthDate = student.BirthDate;
tempStudent.Courses = student.Courses;
Context.Entry(tempStudent).Collection(p => p.Students).Load();
context.Entry(tempStudent).State = EntityState.Modified;
context.SaveChanges();
return true;
}
}

关于c# - 尝试从 EF CodeFirst 更新对象时在多对多表中重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29680927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com