【问题标题】:EF won't create empty databaseEF 不会创建空数据库
【发布时间】:2019-07-11 20:24:03
【问题描述】:

我正在尝试通过 EF 创建一个数据库,以存储成员及其位置。
我看过其他示例,但无论我做什么,当我运行我的程序时,我的数据库都不会被创建。

我注意到我遵循的示例创建了一个 DataInitializer 类,它将一些记录放入数据库中。我还没有这样做,因为我想检查我的数据库是否使用正确的列创建。
数据库中没有数据是问题吗?

public class ApplicationDbContext : DbContext
{
    public DbSet<Lid> Leden { get; set; }
    public DbSet<Locatie> Locaties { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.ApplyConfiguration(new LidConfiguration());
        builder.ApplyConfiguration(new LocatieConfiguration());
    }
}

Appsettings.json:

{ "ConnectionStrings": {
    "DefaultConnection": "Server=.\\sqlexpress;Database=Taijitan;Trusted_Connection=True;MultipleActiveResultSets=true"},
"Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

在我遵循的示例中,startup.cs 还包含

services.AddScoped<BeerhallDataInitializer>();

一直到底部

beerhallDataInitializer.InitializeData();

我不认为这是导致问题的原因,但我不太确定

编辑:

public class BeerhallDataInitializer
{
    private readonly ApplicationDbContext _dbContext;

    public BeerhallDataInitializer(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void InitializeData()
    {
        _dbContext.Database.EnsureDeleted();
        if (_dbContext.Database.EnsureCreated())
        { *create new objects and add them to _dbcontext*
          _dbContext.SaveChanges();
        }
}

【问题讨论】:

  • 您能否展示配置 EF 以使用该连接字符串的部分? BeerhallDataInitializer 是什么样的?
  • 如果你想要一个空数据库,那么你不需要数据库初始化器,你可以使用现有的初始化器之一。您是否尝试仅使用字符串参数“MyDatabase”创建 DbContext?您是否尝试作为初始化器DropCreateDatabaseAlways&lt;ApplicationDbContext&gt;,它是否在OnModelCreating 中达到了您的断点?

标签: c# database entity-framework model-view-controller


【解决方案1】:

为了运行迁移,您首先需要使用以下命令创建迁移: 'dotnet ef 迁移添加 InitialCreate' 其次,您需要使用以下命令运行迁移: 'dotnet ef 数据库更新' 或通过创建一些运行丢失迁移的代码,我可以假设它是 beerhallDataInitializer.InitializeData() 所做的,但不能确定,因为我没有更多关于它的信息,但能够通过代码迁移您需要在 startup.cs 文件中像这样引用 IApplicationBuilder:

            DbInitializer.Migrate<ApplicationDbContext>(app);

我的 dinitilizer 是:

public static class DbInitializer
    {
        public static void Migrate<T>(IApplicationBuilder app) where T : DbContext
        {
            using (var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
            {
                scope.ServiceProvider.GetRequiredService<T>().Database.Migrate();
            }
        }
    }

希望它对任何事情有所帮助,请在下面发表评论,但请提供有关您所做工作的更多信息

编辑:

尝试将连接字符串更改为:

Data Source=localhost\\SQLEXPRESS;Initial Catalog=Taijitan;Integrated Security=True

【讨论】:

  • 感谢帮助,我不记得在我使用的示例中看到过 Migrate,我编辑了帖子并添加了数据初始化程序,其中包含 enureDeleted() 和 ensureCreated(),这是不是类似于 migrate ?
  • 是的,您的 ensureCreated 也能正常工作,您有 Migrations 文件夹吗?如果是,请检查我在帖子上的编辑并告诉我它是否有帮助,如果没有,那么您必须创建一个迁移
猜你喜欢
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 2021-07-03
  • 2017-09-26
  • 1970-01-01
  • 2021-01-17
  • 2022-01-12
相关资源
最近更新 更多