DbContext.Add()和DbContext.DbSet <TEntity> .Add(TEntity)有什么区别?你什么时候使用一个与另一个?

use*_*465 11 asp.net asp.net-mvc razor asp.net-core

在ms docs Razor页面教程中,DbContext有一个DbSet学生集

public class SchoolContext : DbContext
{
    public DbSet<Student> Students { get; set; }
Run Code Online (Sandbox Code Playgroud)

并在OnPostAsync()方法中使用DbSet<TEntity>.Add(TEntity)方法(文档)创建并添加更新的学生:

        var emptyStudent = new Student();
        if (await TryUpdateModelAsync<Student>(
            emptyStudent,
            "student",   // Prefix for form value.
            s => s.FirstMidName, s => s.LastName, s => s.EnrollmentDate))
        {
            _context.Students.Add(emptyStudent);
            await _context.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)

MVC教程也有一个DbContext具有DbSet但是学生在StudentsController.cs的Create()方法后,它增加了学生直接调用DbContext.add()上的DbContext:

_context.Add(student); 
await _context.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)

我看到的另一个区别是,在MVC中,学生作为参数传入:

public async Task<IActionResult> Create([Bind("LastName,FirstMidName,EnrollmentDate")] Student student)

    {
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别吗?它们可以互换使用吗?何时使用其中一种?

Wik*_*hla 10

源代码中,您可以找到InternalDbSet's(这是抽象的具体实现DbSet)Add方法的实现:

public override EntityEntry<TEntity> Add(TEntity entity)
        => _context.Add(entity);
Run Code Online (Sandbox Code Playgroud)

这显然意味着,它只是一个门面过DbContext小号Add.

从技术上讲,这意味着两者完全相同.

  • 我猜到情况正好相反(上下文会调用 DbSet 的 add 方法。)因为 DbContext 中有几个 DbSet。猜猜我需要查找 DbContext.add() 以找出原因(可能我需要等待几周才能找到 EF 文档才能使其有意义)。 (3认同)
  • 快速解释一下:从数据库中提取或添加到数据库中的每个实体都存储在数据库上下文中,并且会跟踪对其的更改。添加一个新实体只是意味着告诉上下文现在开始跟踪它。因此,当您添加实体时,实际上几乎没有发生任何事情,它只会导致将一个条目添加到上下文的更改跟踪器中。 (3认同)