EFCore 源碼


看看  _context.students.Add(str);

這句話的源碼。

程序運行到這里,查看到students 的類型是 Microsoft.EntityFrameworkCore.Internal.InternalDbSet<>

轉到github上查看源碼。 

public override EntityEntry<TEntity> Add(TEntity entity)  => _context.Add(entity);

可以看到這只是 _context 的封裝。

Context  中,Add,Update,Attache,基本一樣,只是改變狀態而已。Delete 多了層判斷

  public virtual EntityEntry<TEntity> Add<TEntity>([NotNull] TEntity entity)  where TEntity : class
        {
            CheckDisposed();
            return SetEntityState(Check.NotNull(entity, nameof(entity)), EntityState.Added);
        }


 public virtual EntityEntry<TEntity> Attach<TEntity>([NotNull] TEntity entity) where TEntity : class
 {

   return SetEntityState(Check.NotNull(entity, nameof(entity)), EntityState.Unchanged);
}

public virtual EntityEntry<TEntity> Update<TEntity>([NotNull] TEntity entity) where TEntity : class
{

return SetEntityState(Check.NotNull(entity, nameof(entity)), EntityState.Modified);

}

  Attach 就是和AsNotracking的反向操作。

 

2. 新建webapi 項目,引入ef, 類似這樣:

   services.AddDbContext<lectureContext>(options => options.UseSqlServer(Configuration.GetConnectionString("lectureContext")));

想當然的,會有DBContext 是抽象類,實現類是lectureContext,那么

  直接在 Configure() 方法中引入DBContext,這樣寫 public void  Configure(.....,DBContext  context), 會發現這個依賴注入是沒有的,運行時會報錯。public void  Configure(.....,lectureContext context), 這樣就可以了。

查看源碼:,這是在容器中,上面的寫法抽象類和實現類是一樣的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM