使用PostgreSQL在实体框架中获取最后添加的记录ID

esyap4oy  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(181)

学生表有id,name,gender,address列。id是身份列。当使用下面的代码行将每个学生的详细信息添加到此表中时,

_dataContext.Students.Add(student);
_dataContext.SaveChanges();

我需要得到最后插入的id值。这个id值我需要插入到其他表说'主题'表作为studentid列。
我怎样才能得到最后插入的ID?

wvt8vs2t

wvt8vs2t1#

Id负责检索ID并修复它所持久化的所有对象的关系。
调用SaveChanges时,DbContext检测对其跟踪的对象的所有修改,并将所有修改保存在单个事务中。SaveChanges本质上是Commit()调用,应仅在工作/业务事务单元的最后调用。
SaveChanges将保存所有新对象或修改对象的所有更改,检索新对象的新ID并修复关系。之后,student.Id应该具有新值沿着与之相关的任何其他新类。
这意味着您可以编写以下代码来持久化新课程和学生,并获取所有这些课程和学生的ID。

var course=new Course(...);
foreach(var i=0;i<10;i++)
{
    course.Students.Add(new Student(...));
}

context.Courses.Add(course);

context.SaveChanges();

Console.WriteLine($"Course ID: {course.Id}");
foreach(var s in course.Students)
{
    Console.WriteLine($"Student ID: {s.Id}");    
}

DbSet.Add方法在Added状态下将根课程和 all 可达对象添加到DbContext中。所有这些对象都将由SaveChanges保存。
如果您想放弃更改,只要不调用SaveChanges即可。当DbContext被释放时,更改也将丢失。
这就解释了为什么所有非“repository”的CRUD类都被破坏得如此严重。

public int BadInsert(Student student)
{
    _context.Students.Add(student);
    _context.SaveChanges();
}

无法回滚可能在单个Student之外执行的数十个DELETE、UPDATE和INSERT。如果出现错误,您必须显式打开连接并启动长时间运行的事务才能回滚该Student。

bvuwiixz

bvuwiixz2#

从我的表中选择时间戳,值,卡ORDER BY时间戳DESC LIMIT 1

相关问题