代码之家  ›  专栏  ›  技术社区  ›  punkouter

在asp.net core中使用时,如何从另一个项目访问ef core的dbcontext?

  •  0
  • punkouter  · 技术社区  · 7 年前

    我按照这个模式使用ef core和asp.net core,一切都很好。但最近我创建了一个“计算”项目,想从中进行数据库调用。

    问题是我不知道如何创造一个新的 DbContextOptions . 在我的代码中

       services.AddDbContext<RetContext>(options => options
                .UseLazyLoadingProxies()
                .UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    

    但在一个新的.NET核心类中,我需要手动提供它。我该怎么做?我的代码是这样的:

     public static class LoadData
    {
        public static IConfiguration Configuration { get; }
    
        public static RefProgramProfileData Load_RefProgramProfileData(string code)
        {
            // var optionsBuilder = new DbContextOptionsBuilder<RetContext>();
            // optionsBuilder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
    
            //How do I make an optionsbuilder and get the configuration from the WEB project?
           UnitOfWork uow = new UnitOfWork(new RetContext(optionsBuilder));
    
    
            var loadedRefProgramProfileData  = uow.RefProgramProfileDataRepository
                .Find(x => x.ProgramCode == code).FirstOrDefault();
    
            return loadedRefProgramProfileData;
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Alisson Reinaldo Silva    5 年前

    您可以实例化 DbContext 这样地:

    var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
    var configuration = builder.Build();
    var optionsBuilder = new DbContextOptionsBuilder<RetContext>();
    optionsBuilder.UseSqlServer(configuration.GetConnection("DefaultConnection"));
    _context = new RetContext(optionsBuilder.Options); 
    

    然而,理想的方法是使用依赖注入。假设你有一节课 CalculationService 在你的另一个项目中。为此,您需要将该类注册为可以注入的服务:

    services.AddScoped<CalculationService>();
    

    然后你的课可以收到 数据库上下文 (或任何其他服务)通过DI:

    public class CalculationService
    {
        private RetContext _context;
    
        public CalculationService(RetContext context)
        {
            _context = context;
        }
    }
    

    很自然,您将无法像这样手动实例化类:

    var service = new CalculationService();
    

    相反,你需要用你的 计算服务 也可以通过di接收它并使该类也可注入。