Database.EnsureCreated()不创建表

时间:2018-01-12 21:44:29

标签: .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; }
}

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();
        }
    }

每当我运行它时,异常总是被抛出。 &#34;对象引用未设置为对象的实例。&#34; 使用以下stacktrace:

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()

任何想法如何解决这个问题?

更新:我在笔记本电脑上尝试过这个问题。我还尝试进行初始迁移(add-migration,update-database)并将context.Database.EnsureCreated()更改为context.Database.Migrate()。并且错误是相同的,除了出现的问题是context.SaveChanges()

2 个答案:

答案 0 :(得分:1)

基本上,我不知道该教程中会发生什么,或者为什么该解决方案有效。

我发现服务不是在program.cs中构建的,这就是代码无法工作的原因。我正在使用的解决方法是

    public static void Seed(IServiceCollection services)
    {
        ServiceProvider serviceProvider = services.BuildServiceProvider();
        var TournamentDb = serviceProvider.GetRequiredService<TournamentDbContext>();
        DbInitializer.Initialize(TournamentDb);
    }

在Startup.cs内部,我使用public void ConfigureServices(IServiceCollection services)Startup.Seed(services)内部调用。

我不知道这是否意味着它的使用方式,但确实有效。

答案 1 :(得分:0)

在上面的行var host = BuildWebHost(args);中构建WebHost时,似乎会调用Startup.ConfigureServices()。

您的模型是否可能引起EnsureCreated上的异常,然后由于try ... catch而未被注意到?那就是我遇到的问题。相同的症状。尝试通过context.Database.EnsureCreated();进行调试,看看是否碰到了catch块。

据我所知,您的解决方案将通过一系列不必要的函数调用来执行与原始代码相同的操作。