Entity Framework Code First 初始创建

Entity Framework Code First Initial Create

我第一次尝试使用 Entity Framework 从头开始​​创建 Web 应用程序 (.net core 2.1)。由于某种原因,我无法生成数据库。

所以我安装了 EF nuget。并做了接下来的事情:

添加了继承自 DbContext 的 class:

public class ApplicationDbContext:DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        public DbSet<Server> Servers { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Server>().HasData(
                new Server
                {
                    Name = "My Server",
                    InUse = false
                }
            );
        }
    }

并创建实体:

public class Server
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Name { get; set; }
        public bool InUse { get; set; }
    }

在startup.cs的ConfigureServices方法中我添加了:

var connectionString = Configuration.GetConnectionString("ApplicationConnection");
services.AddDbContext<ApplicationDbContext>
                    (options => options.UseSqlServer(connectionString));

来自 appsettings 的连接字符串,我对其进行了调试,因此它确实通过了,它与我在其他项目中使用的字符串相同,只是数据库名称值不同,应该没问题。

我还 运行 从控制台添加迁移命令所以我得到了带有 InitialCreate 迁移和一些快照文件的迁移文件夹。

但是当我 运行 应用程序时,我没有收到任何错误,但它从未在 InitialCreate.cs 迁移中遇到断点,因此永远不会创建数据库。

我应该在哪里调用什么来触发这些?

  1. 如果你想entity framework自动创建你的数据库

    在配置文件中,在构造函数中添加这一行: AutomaticMigrationsEnabled = true;

    然后将代码添加到DBContext中:

    Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContext>());

    然后当申请已经运行:

    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContext>());

    你也可以看看MigrateDatabaseToLatestVersion

  2. 如果手动跟踪数据库版本:

    更新AutomaticMigrationsEnabled = false;

    从控制台,运行 命令 Update-Database 迁移您的数据库 手动

所以我能够通过在 Configure() 方法 Startup.cs 中添加下一个代码来创建数据库

      using (var scope = app.ApplicationServices.CreateScope())
            {
                var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
                dbContext.Database.Migrate();

                if (!dbContext.Servers.Any())
                {
                    dbContext.Servers.Add(new Server
                    {
                        Name = "My Server",
                        InUse = false
                    });
                    dbContext.SaveChanges();
                }

            }