我将遵循本教程:https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro
TournamentDbContext.cs:
public class TournamentDbContext : DbContext
{
public TournamentDbContext(DbContextOptions<TournamentDbContext> options) : base(options)
{
}
public DbSet<Tournaments> Tournaments { get; set; }
public DbSet<TournamentType> TournamentType { get; set; }
}
Program.cs
public static void Main(string[] args)
{
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var TournamentDb = services.GetRequiredService<TournamentDbContext>();
DbInitializer.Initialize(TournamentDb);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while seeding the database.");
}
}
host.Run();
}
初始化方法:
public static void Initialize(TournamentDbContext context)
{
context.Database.EnsureCreated();
if (!context.Tournaments.Any())
{
context.TournamentType.Add(new Models.Tournaments.TournamentType { Id = 1, Type = "LAN EVENT" });
context.Tournaments.Add(new Models.Tournaments.Tournaments { Id = 1, Name = "Dummy lan tournament", TournamentTypeId = 1, DateFrom = DateTime.Now, DateTo = DateTime.MaxValue, SalesOpen = DateTime.Now, SalesClose = DateTime.MaxValue, Active = true, DateCreated = DateTime.Now });
context.SaveChanges();
}
}
每当我运行它时,总是抛出异常。“对象引用未设置为对象的实例。”使用以下堆栈跟踪:
Stacktrace: StackTrace = " at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.System.IObserver<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.OnNext(KeyValuePair`2 keyValuePair)\r\n at System.Diagnostics.DiagnosticListener
如果运行调试器,它会通过EnsureCreated()方法,但不会创建表。异常在以下位置抛出:!context.Tournaments.Any()
有什么办法解决这个问题吗?
更新:我在我的笔记本上试过了,同样的问题。我还尝试进行初始迁移(添加迁移、更新数据库)并将context.Database.EnsureCreated()
更改为context.Database.Migrate()。和错误是一样的,只是出现的问题都是context.SaveChanges()
发布于 2018-01-16 00:39:02
基本上,我不知道该教程中发生了什么,也不知道该解决方案为什么有效。
我发现服务还没有构建在program.cs中,这就是代码不能工作的原因。我使用的一个变通方法是
public static void Seed(IServiceCollection services)
{
ServiceProvider serviceProvider = services.BuildServiceProvider();
var TournamentDb = serviceProvider.GetRequiredService<TournamentDbContext>();
DbInitializer.Initialize(TournamentDb);
}
在Startup.cs内部,我使用Startup.Seed(services)
在public void ConfigureServices(IServiceCollection services)
内部调用。
我不知道这是否意味着它是如何使用的,但它确实有效。
发布于 2018-12-19 05:34:25
当在上面的var host = BuildWebHost(args);
行中构建WebHost时,似乎会调用Startup.ConfigureServices()。
有没有可能是你的模型导致了EnsureCreated
上的异常,然后由于try...catch而被忽略了?这就是我的问题所在。同样的症状。尝试通过context.Database.EnsureCreated();
进行调试,看看是否命中了catch块。
据我所知,您的解决方案将做与原始代码相同的事情,只是通过一系列不必要的函数调用。
发布于 2021-08-15 23:28:07
我遇到了一个与您非常相似的问题,事实证明这是因为数据库最初创建不正确,所以以后每次尝试创建表时都会失败。我的修复方法是调用.EnsureDeleted()一次,在此之前删除它并从头开始,然后它就可以工作了。如果您不想每次都重新创建EnsureDeleted,那么只需删除它。
db.Database.EnsureDeleted();
db.Database.EnsureCreated();
https://stackoverflow.com/questions/48234411
复制相似问题