首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Database.EnsureCreated()不创建表

Database.EnsureCreated()不创建表
EN

Stack Overflow用户
提问于 2018-01-13 05:44:29
回答 3查看 4.2K关注 0票数 5

我将遵循本教程:https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro

TournamentDbContext.cs:

代码语言:javascript
复制
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

代码语言:javascript
复制
  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();
    }

初始化方法:

代码语言:javascript
复制
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();
        }
    }

每当我运行它时,总是抛出异常。“对象引用未设置为对象的实例。”使用以下堆栈跟踪:

代码语言:javascript
复制
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()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-16 00:39:02

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

我发现服务还没有构建在program.cs中,这就是代码不能工作的原因。我使用的一个变通方法是

代码语言:javascript
复制
    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)内部调用。

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

票数 1
EN

Stack Overflow用户

发布于 2018-12-19 05:34:25

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

有没有可能是你的模型导致了EnsureCreated上的异常,然后由于try...catch而被忽略了?这就是我的问题所在。同样的症状。尝试通过context.Database.EnsureCreated();进行调试,看看是否命中了catch块。

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

票数 0
EN

Stack Overflow用户

发布于 2021-08-15 23:28:07

我遇到了一个与您非常相似的问题,事实证明这是因为数据库最初创建不正确,所以以后每次尝试创建表时都会失败。我的修复方法是调用.EnsureDeleted()一次,在此之前删除它并从头开始,然后它就可以工作了。如果您不想每次都重新创建EnsureDeleted,那么只需删除它。

代码语言:javascript
复制
            db.Database.EnsureDeleted();
            db.Database.EnsureCreated();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48234411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档