在使用过EF6 (像this)之后,我想试试EF Core,因为我看过一些文章和视频,说它比EF6有很大的优势。
所以,我用class做了一个示例程序:
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中。问题是,第一个查询大约需要5秒,数据库中有10行。下一个是即时的。
我在安装了固态硬盘和i5处理器的电脑上工作。
有什么问题吗?是SQLite吗?它是Database.Migrate();吗(如果我注释此行,它不会更改任何内容)?或者所有的性能改进都很糟糕?
发布于 2018-07-29 04:16:52
实际上,只有在调试时才会出现问题。原因是实体框架抛出并捕获了数千个异常,它们减慢了调试器的运行速度。请参阅GitHub issue here。
为了解决这个问题,我在Tools -> Options -> Debugging -> General中启用了"Enable Just My Code“选项。这样,Visual Studio就不会跟踪Entity Framework中的异常。
https://stackoverflow.com/questions/49353909
复制相似问题