在不使用实体框架的多到多中插入记录
本文关键字:插入 记录 框架 实体 | 更新日期: 2023-09-27 18:36:25
我想在他们的表中插入 2 条新记录,并创建多对多的关系。
这个主题有很多问题,我尝试了很多答案,现在我不知道为什么我的代码不起作用。
请帮帮我!
这是代码:
class Program
{
static void Main(string[] args)
{
MyContext db = new MyContext();
var st1 = new Student() { Name = "Joe" };
var c1 = new Course() { Name = "Math" };
db.Courses.Attach(c1);
st1.Courses.Add(c1);
db.Students.Add(st1);
db.SaveChanges();
}
}
public class Student
{
public Student()
{
Courses = new HashSet<Course>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasMany(p => p.Courses)
.WithMany(d => d.Students)
.Map(t =>
{
t.MapLeftKey("studentId");
t.MapRightKey("courseid");
t.ToTable("StudentCourse");
});
base.OnModelCreating(modelBuilder);
}
}
编辑:就像 sugested 一样,我初始化了课程:
public Student()
{
Courses = new HashSet<Course>();
}
现在我在数据库上收到此错误。保存更改();
保存未公开其关系的外键属性的实体时出错。属性将返回 null,因为无法将单个实体标识为异常的来源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅 InnerException。
您显然正在尝试向数据库添加新Student
并将其关联到现有Course
。问题是您将新的Course
实体附加到上下文中,而没有适当的主键。
在这里使用所谓的存根实体当然是一个好主意,因为它节省了对数据库的往返以获取现有Course
,但 EF 需要主键才能创建正确的关联记录。它甚至是您需要在此Course
存根中设置的唯一属性:
var st1 = new Student() { Name = "Joe" };
var c1 = new Course() { CourseId = 123 };
db.Courses.Attach(c1);
st1.Courses.Add(c1);
db.Students.Add(st1);
如果要添加新课程和新学生,则应同时Add
它们:
db.Courses.Add(c1);
st1.Courses.Add(c1);
db.Students.Add(st1);
您的代码未初始化任一类中的ICollection
对象。
public class Student
{
private Student()
{
Courses = new List<Course>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
编辑
尝试将模型生成器代码更改为以下内容
modelBuilder.Entity<Student>()
.HasMany<Course>(s => s.Courses)
.WithMany(c => c.Students)
.Map(cs =>
{
cs.MapLeftKey("StudentRefId");
cs.MapRightKey("CourseRefId");
cs.ToTable("StudentCourse");
});
代码示例直接取自:
http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx