Sto usando .net core 2 e entityframework 6.2. Sto provando a seminare il database con alcuni dati di base necessari.
Main
della classe Program
(come mostrato di seguito). DbContext
metodo SaveChange
di DbContext
, DbContext
sempre l'errore NullReferenceException. Classe di programma:
public class Program
{
public static void Main(string[] args)
{
//BuildWebHost(args).Run();
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<ApplicationDbContext>();
context.Provinces.Add(new Models.Province
{
ID = 1,
Name = "TEST"
});
context.SaveChanges(); // <= ERROR
//DbInitializer.Initialize(context);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occured while seeding the database.");
}
}
host.Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Eccezione:
Message: "Object reference not set to an instance of an object."
Source: "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore"
StackTrace:
at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.System.IObserver<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.OnNext(KeyValuePair`2 keyValuePair)
at System.Diagnostics.DiagnosticListener.Write(String name, Object value)
at Microsoft.EntityFrameworkCore.Internal.CoreLoggerExtensions.SaveChangesFailed(IDiagnosticsLogger`1 diagnostics, DbContext context, Exception exception)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
at Invitation.Program.Main(String[] args) in d:\Projects\Invitation\Invitation\Program.cs:line 29
InnerException: null
Classe di avvio:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddCustomIdentity()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddTransient<IdentityErrorDescriber, FaIdentityErrorDescriber>();
services.ConfigureCustomApplicationCookie();
services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeFolder("/Account/Manage");
options.Conventions.AuthorizePage("/Account/Logout");
});
var connection = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connection));
services.AddSingleton<IEmailSender, EmailSender>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc();
}
}
Classe ApplicationDbContext:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
public DbSet<Province> Provinces { get; set; }
}
BW sto usando EntityFramework 6.2.0 e Microsoft.EntityFrameworkCore.Tools 2.1.1 (forse informazioni utili)
Grazie per aver passato del tempo.
OK! Ho trovato il motivo. Nel metodo Main quando creo una nuova entità di tipo Province, l'assegnazione di valore al suo parametro chiave causa l'errore. Questo risolve il problema:
context.Provinces.Add(new Models.Province
{
//ID = 1,
Name = "TEST"
});
Ma sono davvero arrabbiato perché l'eccezione generata non mostra il vero errore!
Usa questo codice:
public class Program
{
public static void Main(string[] args)
{
//BuildWebHost(args).Run();
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
using (var context = new ApplicationDbContext(
services.GetRequiredService<DbContextOptions<ApplicationDbContext>>()))
{
context.Provinces.Add(new Models.Province
{
ID = 1,
Name = "TEST"
});
context.SaveChanges();
}
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occured while seeding the database.");
}
}
host.Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}