【问题标题】:Generating usable sql from Entity Framework to use for data migrations从实体框架生成可用的 sql 以用于数据迁移
【发布时间】:2013-10-21 05:15:47
【问题描述】:

目前我在尝试构建一个控制台应用程序时遇到了一些麻烦,我可以在其中将一些数据插入到我的数据库中并将 sql 作为额外的文件输出到文件中。我的想法是我可以将这些用于数据迁移或类似的事情。

我有几个查找表,我想预先填充数据,我认为这比手动写出 sql 更好。如果有人需要查找一个值,它就在代码中。

我正在使用EF Tracing,到目前为止,我可以通过执行以下操作来记录 sql 实体框架创建的

我已经迷上了他们的行动以获取跟踪

private void WriteSqlToString(CommandExecutionEventArgs args)
{
    sqlTrace.Append(args.ToTraceString());
}

这给出了这样的东西

insert [dbo].[Members]([EmailAddress], [FirstName], [LastName])
values (@0, @1, @2)
select [Id]
from [dbo].[Members]
where @@ROWCOUNT > 0 and [Id] = scope_identity()
-- @0 (dbtype=String, size=60, direction=Input) = "email@email.com"
-- @1 (dbtype=String, size=-1, direction=Input) = "TestFirstName"
-- @2 (dbtype=String, size=-1, direction=Input) = "TestLastName"

我会第一个举手,因为我不擅长手写sql。我已经搞砸了一点,试图让它在 sqlserver express 中执行,但由于未声明变量而不断出错。

人们是否认为值得继续尝试让它发挥作用,还是我在这里错过了更好的解决方案?


这里还有一些代码供参考

public void CreateSqlFile()
{
    using (MyContext context = tracingContextFactory.Create(WriteSqlToString))
    {
        Migrate(context);
        context.SaveChanges();
    }

    StreamWriter file = new StreamWriter(migrationPath);
    file.WriteLine(sqlTrace.ToString());
    file.Close();
}

【问题讨论】:

  • 如果你想成为一名程序员,学习如何编写sql是值得的。我听说过这本书的好东西,在 10 分钟内自学 SQL。
  • 我对 SQL 的了解达到了合理的水平,但我每天都会说我可能每 6 个月写一次。这只是数据输入的一个例子,所以为什么不尝试编写一个程序,这样我就不必编写 sql 并让它通过属性提供的编译器和 EF 内置数据验证的验证?还有适当的智能感知的额外好处。但是,嘿,如果您喜欢手动输入数据,那就试试吧。

标签: sql sql-server-2008 entity-framework entity-framework-5 database-migration


【解决方案1】:

从 EF 生成的 SQL 可以正常运行,但通常过于复杂且格式错误。

这对 EF 来说很好,因为没有人会看到 SQL。

但是,如果您要使用或尝试修改 SQL,我会选择不同的路线。例如,如果您尝试进行数据迁移,我会查看 SQL Server Integration Services (SSIS)。

编辑

要生成数据以在服务器之间传输,在 SQL Server 管理工作室中,

  • 右键数据库,
  • 单击生成脚本。
  • 选择您的表。
  • 在下一个屏幕上,选择高级选项
  • 在“脚本的数据类型”中,选择“仅数据”。 (或架构和数据,视情况而定)
  • 继续向导结束
  • 成功。

【讨论】:

  • 我真的只对它的功能感兴趣。例如,我有一个包含 200 个条目的查找表。我不想在 sql 中输入它,而是希望能够在代码中定义它,然后将 sql 输出到一个文件,该文件将作为我的数据库迁移的一部分运行。我怀疑很多人会阅读它。
  • 谢谢,这是一个很好的解决方案,可惜不能真正实现自动化
  • @Neil 它可以,如果你愿意的话...见stackoverflow.com/questions/3488666/…
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 2018-10-07
  • 2019-06-24
  • 2017-09-20
  • 2015-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多