【问题标题】:How to create a database from sql script using Entity Framework Core?如何使用 Entity Framework Core 从 sql 脚本创建数据库?
【发布时间】:2019-02-08 23:07:20
【问题描述】:
如果数据库已经存在,我正在使用 EF Core 开始一个项目。我将数据库结构作为 sql 脚本,每次初始化上下文时都想运行它,以便每次运行应用程序时都有一个新的数据库。下面是来自传统 EF 的 sn-p,展示了我希望使用 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"));
}
}
【问题讨论】:
标签:
c#
entity-framework-core
.net-standard-2.0
entity-framework-migrations
【解决方案1】:
在对 EF 有了更多经验之后,我发现将上下文用于创建数据库之类的事情是没有意义的。这将是一个鸡蛋问题,如果上下文无效并且错过了基础表。
这确实使用传统的 SqlCommand 来完成,运行包含 DB 的脚本。
´´´
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();
}
}
´´´
这可以在测试初始化中运行。