实体框架核心在控制台应用程序中获取上下文

时间:2018-11-01 08:13:39

标签: c# dependency-injection entity-framework-core console-application

我有一个包含3个项目的Visual Studio 2017解决方案。一个类库具有DAL(.NET Standart 2.0),一个AP.NET MVC应用程序(.NET Core 2.0)和第三个控制台应用程序(.NET Framework 4.6.1)。

我在两个项目中都引用了DAL。它已经实现了工作单元模式,并使用了Entity Framework Core。

在ASP.NET MVC项目中,我已配置为使用依赖项注入获取上下文,如下所示

services.AddDbContext<ApplicationDbContext>(options =>
{
    options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"],
        b => {
                b.MigrationsAssembly("OpenData.Backend");
                b.CommandTimeout(4000);
            }
            );
});

工作单元的配置如下

// Repositories
services.AddScoped<IUnitOfWork, HttpUnitOfWork>();

在控制器中,我可以像这样使用它:

public class TestServiceController : Controller
{

    private IUnitOfWork _unitOfWork;

    public TestServiceController(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
}

我要在控制台应用程序中使用相同的方法。由于无法将DI放入控制台应用程序,因此我认为可以创建UnitOfWork

的实例。
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString());

_unitOfWork = new UnitOfWork(new ApplicationDbContext(optionsBuilder.Options));

但是我在上面的第一行代码中遇到了以下错误

  

在通用类型或方法“ DbContextOptionsBuilder”中,类型“ DAL.ApplicationDbContext”不能用作类型参数“ TContext”。从'DAL.ApplicationDbContext'到'Microsoft.EntityFrameworkCore.DbContext'没有隐式引用转换。

第二个错误

  

类型'IdentityDbContext <,,>'在未引用的程序集中定义。您必须添加对程序集'Microsoft.AspNetCore.Identity.EntityFrameworkCore,Version = 2.0.1.0,Culture = neutral,PublicKeyToken = adb9793829ddae60'的引用。

ApplicationDbContext声明如下

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
        //Some configuration removed
    }
    // DbSet removed
}

在ASP.NET应用程序中,它与ASP.Net Identity一起使用,但是在控制台应用程序中,则不需要它。

0 个答案:

没有答案