【问题标题】:Database.EnsureCreated() not creating tablesDatabase.EnsureCreated() 不创建表
【发布时间】:2018-01-12 21:44:28
【问题描述】:

我正在关注本教程: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; }
}

程序.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()

【问题讨论】:

    标签: .net entity-framework .net-core


    【解决方案1】:

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

    我发现服务还没有内置在 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)

    我不知道这是否是它的用途,但它确实有效。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        我遇到了与您非常相似的问题,结果证明是因为最初创建的数据库不正确,因此以后每次尝试创建表时都会失败。我的解决方法是调用 .EnsureDeleted() ONCE 之前将其删除并从头开始,然后它就起作用了。如果您不想每次都重新创建它,只需删除 EnsureDeleted。

                    db.Database.EnsureDeleted();
                    db.Database.EnsureCreated();
        

        【讨论】:

        • 是的,但这不是很明显吗?如果数据库以任何形式创建,EnsureCreated 将不会重新创建它。
        • 答案在这种情况下仍然有帮助。我最初还创建了一个无效的数据库,然后只运行了一次上述示例以重新创建所有内容
        猜你喜欢
        • 2017-07-13
        • 2021-12-11
        • 2019-01-13
        • 2016-08-25
        • 2012-04-16
        • 2016-01-21
        • 2019-06-04
        • 2015-02-08
        • 1970-01-01
        相关资源
        最近更新 更多