首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF Core 2.1启动缓慢

EF Core 2.1启动缓慢
EN

Stack Overflow用户
提问于 2018-03-19 07:30:31
回答 1查看 1.6K关注 0票数 3

在使用过EF6 (像this)之后,我想试试EF Core,因为我看过一些文章和视频,说它比EF6有很大的优势。

所以,我用class做了一个示例程序:

代码语言:javascript
复制
 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; }
    }

然后,我使用泛型存储库创建了一个存储库模式:

代码语言:javascript
复制
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();
    }
}

这就是上下文:

代码语言:javascript
复制
    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();吗(如果我注释此行,它不会更改任何内容)?或者所有的性能改进都很糟糕?

EN

回答 1

Stack Overflow用户

发布于 2018-07-29 04:16:52

实际上,只有在调试时才会出现问题。原因是实体框架抛出并捕获了数千个异常,它们减慢了调试器的运行速度。请参阅GitHub issue here

为了解决这个问题,我在Tools -> Options -> Debugging -> General中启用了"Enable Just My Code“选项。这样,Visual Studio就不会跟踪Entity Framework中的异常。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49353909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档