У меня есть решение Visual Studio 2017 с 3 проектами. Одна библиотека классов с DAL (.NET Standart 2.0), одно приложение AP.NET MVC (.NET Core 2.0) и третье консольное приложение (.NET Framework 4.6.1).
Я ссылался на DAL в обоих проектах. Он внедрил шаблон Unit of Work и использует Entity Framework Core.
В проекте ASP.NET MVC я настроил получение контекста с помощью Dependency Injection следующим образом
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));
Но я получаю следующую ошибку в первой строке кода выше
Тип «DAL.ApplicationDbContext» нельзя использовать в качестве параметра типа «TContext» в универсальном типе или методе «DbContextOptionsBuilder». Не существует неявного преобразования ссылок из 'DAL.ApplicationDbContext' в 'Microsoft.EntityFrameworkCore.DbContext'.
Вторая ошибка
Тип 'IdentityDbContext <,,>' определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку 'Microsoft.AspNetCore.Identity.EntityFrameworkCore, версия = 2.0.1.0, культура = нейтральная, 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, но в консольном приложении это не требуется.