如何使用 Entity Framework 核心从 sql 脚本创建数据库?
How to create a database from sql script using Entity Framework Core?
如果数据库已经存在,我正在使用 EF Core 启动一个项目。我将数据库结构作为 sql 脚本,每次初始化上下文时我都想 运行,以便每次 运行 应用程序时都有一个新的数据库。下面是传统 EF 的一个片段,展示了我想用 EF Core.
实现的目标
internal sealed class AnnotationContextDatabaseInitializer : DropCreateDatabaseAlways<AnnotationContext>
{
public override void InitializeDatabase(AnnotationContext context)
{
base.InitializeDatabase(context);
context.Database.ExecuteSqlCommand(TransactionalBehavior.EnsureTransaction, File.ReadAllText("dropAndCreateEntireDatabase.sql"));
}
}
在对 EF 有了更多的经验之后,我发现使用上下文来创建数据库等事情没有意义。这将是先有鸡还是先有蛋的问题,如果上下文无效,它会错过基础表。
这确实是使用传统的 SqlCommand、运行使用包含数据库的脚本来完成的。
´´´
public void ExecuteNonQuery(string query, string connectionString)
{
string[] splitter = new string[] {"\r\nGO"};
string[] commandTexts = query.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.RetryOpen();
foreach (var commandText in commandTexts)
{
try
{
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = commandText;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
connection.Close();
throw;
}
}
connection.Close();
}
}
´´´
这可以是 运行 让我们在测试初始化中说。
如果数据库已经存在,我正在使用 EF Core 启动一个项目。我将数据库结构作为 sql 脚本,每次初始化上下文时我都想 运行,以便每次 运行 应用程序时都有一个新的数据库。下面是传统 EF 的一个片段,展示了我想用 EF Core.
实现的目标 internal sealed class AnnotationContextDatabaseInitializer : DropCreateDatabaseAlways<AnnotationContext>
{
public override void InitializeDatabase(AnnotationContext context)
{
base.InitializeDatabase(context);
context.Database.ExecuteSqlCommand(TransactionalBehavior.EnsureTransaction, File.ReadAllText("dropAndCreateEntireDatabase.sql"));
}
}
在对 EF 有了更多的经验之后,我发现使用上下文来创建数据库等事情没有意义。这将是先有鸡还是先有蛋的问题,如果上下文无效,它会错过基础表。
这确实是使用传统的 SqlCommand、运行使用包含数据库的脚本来完成的。
´´´
public void ExecuteNonQuery(string query, string connectionString)
{
string[] splitter = new string[] {"\r\nGO"};
string[] commandTexts = query.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.RetryOpen();
foreach (var commandText in commandTexts)
{
try
{
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = commandText;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
connection.Close();
throw;
}
}
connection.Close();
}
}
´´´
这可以是 运行 让我们在测试初始化中说。