I am getting an error in the asp.net mvc project when I am trying to instanciate the database in the home controller. I will show you the home controller as well as the error generated and the BirdProjectContext.cs which is the file that holds the database context.
using BirdProject.Model;
using BirdProject.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace BirdProject.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly BirdProjectContext _db;
public HomeController(ILogger<HomeController> logger, BirdProjectContext db)
{
_logger = logger;
_db = db;
}
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
This is the error:
And this is the structure of the solution:
This is the data inside the BirdProjectContext.cs:
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
namespace BirdProject.Model
{
public partial class BirdProjectContext : DbContext
{
public BirdProjectContext()
{
}
public BirdProjectContext(DbContextOptions<BirdProjectContext> options)
: base(options)
{
}
public virtual DbSet<AspNetRole> AspNetRoles { get; set; } = null!;
public virtual DbSet<AspNetRoleClaim> AspNetRoleClaims { get; set; } = null!;
public virtual DbSet<AspNetUser> AspNetUsers { get; set; } = null!;
public virtual DbSet<AspNetUserClaim> AspNetUserClaims { get; set; } = null!;
public virtual DbSet<AspNetUserLogin> AspNetUserLogins { get; set; } = null!;
public virtual DbSet<AspNetUserToken> AspNetUserTokens { get; set; } = null!;
public virtual DbSet<BirdBto> BirdBtos { get; set; } = null!;
public virtual DbSet<Person> People { get; set; } = null!;
public virtual DbSet<SpotLog> SpotLogs { get; set; } = null!;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
optionsBuilder.UseSqlServer("Server=localhost\\SQLEXPRESS;Database=BirdProject;Trusted_Connection=True;");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AspNetRole>(entity =>
{
entity.HasIndex(e => e.NormalizedName, "RoleNameIndex")
.IsUnique()
.HasFilter("([NormalizedName] IS NOT NULL)");
entity.Property(e => e.Name).HasMaxLength(256);
entity.Property(e => e.NormalizedName).HasMaxLength(256);
});
modelBuilder.Entity<AspNetRoleClaim>(entity =>
{
entity.HasIndex(e => e.RoleId, "IX_AspNetRoleClaims_RoleId");
entity.HasOne(d => d.Role)
.WithMany(p => p.AspNetRoleClaims)
.HasForeignKey(d => d.RoleId);
});
modelBuilder.Entity<AspNetUser>(entity =>
{
entity.HasIndex(e => e.NormalizedEmail, "EmailIndex");
entity.HasIndex(e => e.NormalizedUserName, "UserNameIndex")
.IsUnique()
.HasFilter("([NormalizedUserName] IS NOT NULL)");
entity.Property(e => e.Email).HasMaxLength(256);
entity.Property(e => e.NormalizedEmail).HasMaxLength(256);
entity.Property(e => e.NormalizedUserName).HasMaxLength(256);
entity.Property(e => e.UserName).HasMaxLength(256);
entity.HasMany(d => d.Roles)
.WithMany(p => p.Users)
.UsingEntity<Dictionary<string, object>>(
"AspNetUserRole",
l => l.HasOne<AspNetRole>().WithMany().HasForeignKey("RoleId"),
r => r.HasOne<AspNetUser>().WithMany().HasForeignKey("UserId"),
j =>
{
j.HasKey("UserId", "RoleId");
j.ToTable("AspNetUserRoles");
j.HasIndex(new[] { "RoleId" }, "IX_AspNetUserRoles_RoleId");
});
});
modelBuilder.Entity<AspNetUserClaim>(entity =>
{
entity.HasIndex(e => e.UserId, "IX_AspNetUserClaims_UserId");
entity.HasOne(d => d.User)
.WithMany(p => p.AspNetUserClaims)
.HasForeignKey(d => d.UserId);
});
modelBuilder.Entity<AspNetUserLogin>(entity =>
{
entity.HasKey(e => new { e.LoginProvider, e.ProviderKey });
entity.HasIndex(e => e.UserId, "IX_AspNetUserLogins_UserId");
entity.Property(e => e.LoginProvider).HasMaxLength(128);
entity.Property(e => e.ProviderKey).HasMaxLength(128);
entity.HasOne(d => d.User)
.WithMany(p => p.AspNetUserLogins)
.HasForeignKey(d => d.UserId);
});
modelBuilder.Entity<AspNetUserToken>(entity =>
{
entity.HasKey(e => new { e.UserId, e.LoginProvider, e.Name });
entity.Property(e => e.LoginProvider).HasMaxLength(128);
entity.Property(e => e.Name).HasMaxLength(128);
entity.HasOne(d => d.User)
.WithMany(p => p.AspNetUserTokens)
.HasForeignKey(d => d.UserId);
});
modelBuilder.Entity<BirdBto>(entity =>
{
entity.HasKey(e => e.MetalRing);
entity.ToTable("BirdBTO");
entity.Property(e => e.MetalRing)
.HasMaxLength(50)
.IsUnicode(false)
.HasColumnName("metalRing");
entity.Property(e => e.ColourPos)
.HasMaxLength(20)
.IsUnicode(false)
.HasColumnName("colourPos");
entity.Property(e => e.ColourRing)
.HasMaxLength(20)
.IsUnicode(false)
.HasColumnName("colourRing");
entity.Property(e => e.Latitude).HasColumnName("latitude");
entity.Property(e => e.Longitude).HasColumnName("longitude");
entity.Property(e => e.MetalPos)
.HasMaxLength(20)
.IsUnicode(false)
.HasColumnName("metalPos");
entity.Property(e => e.Sex)
.HasMaxLength(1)
.IsUnicode(false)
.HasColumnName("sex");
entity.Property(e => e.Specie)
.HasMaxLength(30)
.IsUnicode(false)
.HasColumnName("specie");
});
modelBuilder.Entity<Person>(entity =>
{
entity.HasKey(e => e.Email);
entity.ToTable("Person");
entity.Property(e => e.Email)
.HasMaxLength(50)
.IsUnicode(false)
.HasColumnName("email");
entity.Property(e => e.FullName)
.HasMaxLength(50)
.IsUnicode(false);
});
modelBuilder.Entity<SpotLog>(entity =>
{
entity.HasKey(e => e.SpotId);
entity.ToTable("SpotLog");
entity.Property(e => e.SpotId)
.ValueGeneratedNever()
.HasColumnName("spotID");
entity.Property(e => e.Date)
.HasColumnType("date")
.HasColumnName("date");
entity.Property(e => e.Email)
.HasMaxLength(50)
.IsUnicode(false)
.HasColumnName("email");
entity.Property(e => e.Latitude).HasColumnName("latitude");
entity.Property(e => e.Longitude).HasColumnName("longitude");
entity.Property(e => e.MetalRing)
.HasMaxLength(50)
.IsUnicode(false)
.HasColumnName("metalRing");
entity.HasOne(d => d.EmailNavigation)
.WithMany(p => p.SpotLogs)
.HasForeignKey(d => d.Email)
.HasConstraintName("FK_SpotLog_Person");
entity.HasOne(d => d.MetalRingNavigation)
.WithMany(p => p.SpotLogs)
.HasForeignKey(d => d.MetalRing)
.HasConstraintName("FK_SpotLog_BirdBTO");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
}
This is the Program.cs:
using BirdProject.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
CodePudding user response:
Your HomeController
requires a BirdProjectContext
but it can't be resolved from the dependency container.
To fix this, register your db context as a service.
Inside your ConfigureServices
method
services.AddDbContext<BirdProjectContext>(options =>
{ /* do some configuration with your options*/
});