我正在构建一个ASP.Net应用程序,它是一个模拟器,作为单独的威胁,许多动作将在Controller外部发生,但我正在努力在Controller外部创建DbContext连接。我知道我可以使用OnConfiguring(DbContextOptionsBuilder optionsBuilder),但我认为它不是最优雅的方式。

我通过这样的事情应该工作:

public class SimRepository : ISimRepository
{
    public IConfiguration _configuration;
    public DbContextOptionsBuilder _dbOptions;

    public SimRepository(IConfiguration configuration)
    {
        _configuration = configuration;

        _dbOptions = new DbContextOptionsBuilder();
        _dbOptions.UseSqlServer(_configuration.GetConnectionString("DefaultConnection"));
    }

    public void LatheIn()
    {
        using (AppDbContext db = new AppDbContext(_dbOptions.Options))
        {

        }
    }
}


但我收到此错误:

Argument 1: cannot convert from Microsoft.EntityFrameworkCore.DbContextOptions' to Microsoft.EntityFrameworkCore.DbContextOptions<Simulator_Line.Server.AppDbContext>


在启动中:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    services.AddMvc();

    //Enable use of appsettings.json outside of Startup.cs
    services.AddSingleton(Configuration);
    services.AddSingleton<IConfiguration>(Configuration);
}


如果我的方法不正确,则可以接受更改。

编辑

    public class LatheController : Controller
{
    private readonly AppDbContext _dbContext;
    private readonly SimRepository _simRrepo;

    public LatheController(AppDbContext dbContext, SimRepository latheRepo)
    {
        _dbContext = dbContext;
        _simRrepo = latheRepo;
    }

    [HttpGet]
    public IEnumerable<Lathe> GetLathes()
    {
        _simRrepo.LatheIn();



        return _dbContext.Lathes;
    }
}

最佳答案

您已经在服务集合中注册了DbContext。只需将其注入到依赖类中,以便在解析依赖类时可以对其进行解析

public class SimRepository : ISimRepository {
    public readonly AppDbContext db;

    public SimRepository(AppDbContext db) {
        this.db = db;
    }

    public void LatheIn() {
        //...use db
    }
}


更新资料

您可以创建工厂

public interface IAppDbContextFactory {
    AppDbContext Create();
}


用于根据需要创建实例

public class SimRepository : ISimRepository {
    public readonly IAppDbContextFactory factory;

    public SimRepository(IAppDbContextFactory factory) {
        this.factory = factory;
    }

    public void LatheIn() {
        using (AppDbContext db = factory.Create()) {
            //...use db
        }
    }
}


工厂实现可能看起来像

public class AppDbContextFactory : IAppDbContextFactory {
    private readonly IServiceProvider servideProvider;

    public AppDbContextFactory(IServiceProvider servideProvider) {
        this.serviceProvider = serviceProvider;
    }

    public AppDbContext Create() {
        return serviceProvider.GetService<AppDbContext>();
    }
}


确保在服务集合中注册您的类型。

public void ConfigureServices(IServiceCollection services) {
    // Add framework services.
    services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    services.AddMvc();

    //Enable use of appsettings.json outside of Startup.cs
    services.AddSingleton(Configuration);
    services.AddSingleton<IConfiguration>(Configuration);

    services.AddSingleton<IAppDbContextFactory, AppDbContextFactory>();
    services.AddTransient<ISimRepository, SimRepository>();
}


以便可以在需要的地方使用

public class SomeController : Controller {
    private readonly ISimRepository simRepository;
    public SomeController(ISimRepository simRepository) {
        this.simRepository = simRepository;
    }

    public IActionResult SomeAction() {
        simRepository.LatheIn();
        return Ok();
    }
}

关于c# - 如何在Controller外部使用EF DbContext?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45236783/

10-12 12:43
查看更多