Код: Выделить всё
GemsIrisDiMvc.Application/
GemsIrisDiMvc.Domain/
GemsIrisDiMvc.Infrastructure/
│ ├── Data/
│ │ └── ApplicationDbContext.cs
│ ├── ApplicationDbContextFactory.cs
│ └── Migrations/
GemsIrisDiMvc.Web/
│ ├── appsettings.json
│ └── Program.cs
< /code>
Команда: < /p>
dotnet ef migrations add InitialCreate --project GemsIrisDiMvc.Infrastructure --startup-project GemsIrisDiMvc.Web
< /code>
Я получаю эту ошибку: < /p>
Невозможно создать «dbcontext» типа '. Исключение «Справочник объекта не устанавливается на экземпляр объекта». был брошен при попытке создать экземпляр. < /p>
< /blockquote>
ApplicationDbContext.cs
Код: Выделить всё
using GemsIrisDiMvc.Domain.Entities;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace GemsIrisDiMvc.Infrastructure.Data
{
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions options) : base(options) { }
public DbSet Invoices { get; set; }
public DbSet InvoiceItems { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);
}
}
}
< /code>
ApplicationDbContextFactory.cs
Код: Выделить всё
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
namespace GemsIrisDiMvc.Infrastructure.Data
{
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory
{
public ApplicationDbContext CreateDbContext(string[] args)
{
// Get the path to the Web project's appsettings.json
var path = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "../GemsIrisDiMvc.Web"));
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("appsettings.json")
.AddJsonFile("appsettings.Development.json", optional: true)
.Build();
var optionsBuilder = new DbContextOptionsBuilder();
var connectionString = configuration.GetConnectionString("DefaultConnection");
if (string.IsNullOrEmpty(connectionString))
{
throw new InvalidOperationException("The connection string 'DefaultConnection' was not found in appsettings.json.");
}
optionsBuilder.UseSqlServer(connectionString);
return new ApplicationDbContext(optionsBuilder.Options);
}
}
}
< /code>
Program.cs
Код: Выделить всё
using GemsIrisDiMvc.Domain.Entities;
using GemsIrisDiMvc.Infrastructure.Data;
using GemsIrisDiMvc.Infrastructure.Extensions;
using GemsIrisDiMvc.Infrastructure.HttpClients;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using System.Security.Authentication;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container
builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
//builder.Services.AddHttpClient()
// .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
// {
// SslProtocols = SslProtocols.Tls12 // ✅ Enforce TLS 1.2
// });
// Add Identity services
builder.Services.AddIdentity(options =>
{
options.SignIn.RequireConfirmedAccount = false;
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
})
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
// Configure cookie authentication
builder.Services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Account/Login";
options.LogoutPath = "/Account/Logout";
options.AccessDeniedPath = "/Account/AccessDenied";
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.SlidingExpiration = true;
});
// Add Infrastructure services
builder.Services.AddInfrastructureServices(builder.Configuration);
// Add MVC
builder.Services.AddControllersWithViews();
// Add Swagger for API documentation
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
// Ensure database is created and migrations applied
using (var scope = app.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService();
try
{
context.Database.Migrate();
}
catch (Exception ex)
{
var logger = scope.ServiceProvider.GetRequiredService();
logger.LogError(ex, "An error occurred while applying migrations or creating the database.");
}
}
app.Run();
< /code>
Despite having the IDesignTimeDbContextFactory
Что я делаю неправильно? Есть ли лучший способ структурировать или ссылаться на вещи, поэтому Dotnet EF может разрешить контекст?
Подробнее здесь: https://stackoverflow.com/questions/796 ... nning-migr