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 迁移中遇到断点,因此永远不会创建数据库。
我应该在哪里调用什么来触发这些?
如果你想entity framework自动创建你的数据库
在配置文件中,在构造函数中添加这一行:
AutomaticMigrationsEnabled = true;
然后将代码添加到DBContext中:
Database.SetInitializer(new
DropCreateDatabaseAlways<YourDbContext>());
然后当申请已经运行:
Database.SetInitializer(new
DropCreateDatabaseIfModelChanges<YourDbContext>());
你也可以看看MigrateDatabaseToLatestVersion
如果手动跟踪数据库版本:
更新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();
}
}
我第一次尝试使用 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 迁移中遇到断点,因此永远不会创建数据库。
我应该在哪里调用什么来触发这些?
如果你想entity framework自动创建你的数据库
在配置文件中,在构造函数中添加这一行:
AutomaticMigrationsEnabled = true;
然后将代码添加到DBContext中:
Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContext>());
然后当申请已经运行:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContext>());
你也可以看看
MigrateDatabaseToLatestVersion
如果手动跟踪数据库版本:
更新
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();
}
}