Ash*_*ley 5 .net entity-framework .net-core
我正在关注本教程: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; }
}
Run Code Online (Sandbox Code Playgroud)
程序.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();
    }
Run Code Online (Sandbox Code Playgroud)
初始化方法:
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();
        }
    }
Run Code Online (Sandbox Code Playgroud)
每当我运行它时,总是会抛出异常。“你调用的对象是空的。” 使用以下堆栈跟踪:
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
Run Code Online (Sandbox Code Playgroud)
如果我运行调试器,它会通过 EnsureCreated() 方法,但它不会创建表。异常被抛出:!context.Tournaments.Any()
任何想法如何解决这一问题?
更新:我在我的笔记本电脑上试过这个,同样的问题。我还尝试进行初始迁移(添加迁移、更新数据库)并更改context.Database.EnsureCreated()为 context.Database.Migrate()。和错误是一样的,除了出现的问题是context.SaveChanges()
基本上,我不知道该教程中发生了什么,也不知道该解决方案为何有效。
我发现program.cs中还没有内置服务,这就是代码无法工作的原因。我正在使用的解决方法是这样的
    public static void Seed(IServiceCollection services)
    {
        ServiceProvider serviceProvider = services.BuildServiceProvider();
        var TournamentDb = serviceProvider.GetRequiredService<TournamentDbContext>();
        DbInitializer.Initialize(TournamentDb);
    }
Run Code Online (Sandbox Code Playgroud)
在 Startup.cs 内部,我在内部public void ConfigureServices(IServiceCollection services)使用Startup.Seed(services).
我不知道这是否是它的用途,但它确实有效。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3884 次  |  
        
|   最近记录:  |