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