insert - 插入包含集合导航属性的实体
问题描述
我有两节课:
public class Student
{
public int StudentID { get; set; }
public List<Course> Courses { get; set; }
}
public class Course
{
public int CourseID { get; set; }
public string Name { get; set; }
}
还有一个上下文:
public class DBContext: DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
public DBContext(DbContextOptions<DBContext> options) : base(options) { }
}
课程和学生可以彼此独立存在。换句话说,我可以先创建一个课程,然后创建一个学生并将它们与课程相关联。
例如:
var options = new DbContextOptionsBuilder<DBContext>().UseSqlite("Data Source=.\\test.db;");
Course course = null;
using(var context = new DBContext(options.Options))
{
context.Database.EnsureCreated();
}
using (var context = new DBContext(options.Options))
{
course = context.Courses.Add(new Course { Name = "Algebra" }).Entity;
context.SaveChanges();
}
using (var context = new DBContext(options.Options))
{
var student = context.Students.Add(new Student { Courses = new List<Course> { course } });
context.SaveChanges();
}
但是,在最后一个上下文范围内,我得到一个唯一约束错误。我知道有些人说我需要在相同的背景下做所有事情。但这在使用例如 WebAPI 微服务架构(StudentService 和 CourseService)时几乎是不可能的。
那么我该如何处理呢?
解决方案
这里的问题是,在最后一个 using 块context
中,不知道该course
实例已在先前的操作中保存。
SaveChanges
我做了一个小测试,我看到该课程在第二次使用块调用后没有从数据库中分配的 ID 。
通常,执行此操作的最常见方法是从我们需要保存数据的同一上下文中获取实体。所以这会成功。
Course course = new Course { Name = "Algebra" };
using (var context = new DBContext(options.Options))
{
context.Database.EnsureCreated();
}
using (var context = new DBContext(options.Options))
{
context.Courses.Add(course);
context.SaveChanges();
}
using (var context = new DBContext(options.Options))
{
var courseFromDb = context.Courses.Single(c => c.CourseID == course.CourseID);
var student = context.Students.Add(new Student { Courses = new List<Course> {courseFromDb}});
context.SaveChanges();
}
推荐阅读
- reactjs - Django Rest Framework 端点不适用于 SPA 和 axios,但适用于其他客户端,如 vscode REST 客户端扩展
- android - OAuth2 - 移动应用重定向问题,停留在浏览器中
- python - 删除或发送 2 个垃圾箱重复文件
- python - 编辑markdown文件的日常脚本
- vb.net - 将程序从 VB2015 迁移到 VB2019 - 程序无法启动
- c# - 将 IdentityUserClaim 导航添加到 IdentityUser
- ansible - stat 和 win_stat 的文件存在检查均失败
- python - 每当我在我是管理员的服务器上运行此禁令命令时,我都会收到 403 Forbidden permission 错误。但它适用于我拥有的服务器
- arrays - C中的二维数组转置矩阵
- php - 启动时如何不执行会话?