在获得了 EF6 的一些经验后(例如this https://stackoverflow.com/questions/48441674/extremely-slow-ef-startup-15-minutes),我想尝试一下 EF Core,因为我读过一些文章,看了一些视频,说它比 EF6 性能好很多。
所以,我在课堂上制作了示例程序:
public interface IEntity
{
int Id { get; set; }
}
public class Employee : IEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
然后我使用通用存储库创建了一个存储库模式:
public interface IRepository<T> : IDisposable where T : IEntity
{
void Insert(T entity);
void Delete(T entity);
IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
IQueryable<T> GetAll();
T GetById(int id);
void Update(T entity);
void BeginTransaction();
IDbContextTransaction Transaction { get; }
}
public class Repository<T> : IRepository<T> where T : class, IEntity
{
private RosterContext _context;
private IDbContextTransaction _transaction;
public Repository(bool wrapTransaction = false)
{
_context = new MyContext();
if (wrapTransaction)
{
_transaction = _context.Database.BeginTransaction();
}
}
public void Update(T entity)
{
_context.Set<T>().Update(entity);
_context.SaveChanges();
}
public void BeginTransaction()
{
if (_transaction == null)
_transaction = _context.Database.BeginTransaction();
}
public void Insert(T entity)
{
_context.Set<T>().Add(entity);
_context.SaveChanges();
}
public void Delete(T entity)
{
var toDelete = GetById(entity.Id);
_context.Set<T>().Remove(toDelete);
_context.SaveChanges();
}
public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
{
return _context.Set<T>().AsNoTracking().Where(predicate);
}
public IQueryable<T> GetAll()
{
return _context.Set<T>().AsNoTracking();
}
public T GetById(int id)
{
return _context.Set<T>().AsNoTracking().FirstOrDefault(x => x.Id == id);
}
public IDbContextTransaction Transaction => _transaction;
public void Dispose()
{
_transaction?.Dispose();
_context?.Dispose();
}
}
这是上下文:
public class MyContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public MyContext()
{
Database.Migrate();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=test.db");
}
}
正如您所看到的,这是最简单的示例:一张表、一个实体以及存储在 SQLite 中的 2 个属性。问题是,第一个查询大约需要 5 秒,数据库中有 10 行。下一个是即时的。
我使用配备 SSD 驱动器和 i5 处理器的计算机。
问题是什么?是 SQLite 吗?是吗Database.Migrate();
(如果我评论这一行它不会改变任何东西)?或者所有的性能改进都只是不好?