0

我想我现在有几个类似的问题,但我现在对谷歌搜索和阅读它们感到非常困惑。由于我有 Code First 方法,并且我添加了迁移支持,更新到数据库,现在我需要一些讨厌的东西,比如触发器、存储过程和视图。据我了解,我需要编写 SQL 创建触发器并将存储过程作为字符串创建到我的 C# Code First 代码中。但是哪里?我需要在哪里添加它们(作为静态或常量字符串)?我还需要编写删除触发器/存储的 procs 字符串吗?以及如何将它们集成到下一个迁移步骤中?有人知道关于这个主题的真正有用的分步博客吗?

我得到了一个建议,即使用“add-migration”命令生成下一个迁移步骤,然后使用触发器定义更新 Up() 和 Down() 方法。这很清楚,但有点偏离代码优先的观点,我担心表定义和表触发器(和存储过程)会分开。另一个建议说要覆盖上下文 OnModelCreating()... 但我看不到它何时执行,如何链接到特定的迁移步骤...

并且请不要争论“使用触发器是一件愚蠢的事情”,因为我的问题比这更广泛......如何首先将任何高级 sql 服务器“对象”添加到代码中,这在 C# 中不容易定义为先码?

4

1 回答 1

1

我最近遇到了类似的问题,我发现的最佳解决方案是从(最初)空迁移运行脚本。我将脚本放在一个文件中,并将其作为资源添加到项目中。

我不得不做的一个有趣的技巧是在脚本文件中放置特殊的分隔符,因为 GO 语句不是 T-SQL 语句。我使用术语 GO--BATCH-- 作为批处理分隔符,以便它在 SQL Server Management Studio 和代码中都有效。在代码中,我只是通过此分隔符拆分脚本并运行多个查询,如下所示:

public partial class CodeHostDiscovery : DbMigration
{
    public override void Up()
    {
        var batches = Properties.Resources.CodeHostDiscoverySqlScript.Split(new string[] {"GO--BATCH--"}, StringSplitOptions.None);
        foreach (var batch in batches)
        {
            Sql(batch);    
        }
    }

    public override void Down()
    {
    }
}

下面是 SQL 脚本的一个片段:

CREATE SCHEMA SystemServices

GO--BATCH--

CREATE TABLE [SystemServices].[HeartbeatConfiguration] (

我不希望 Code First 提供更好的工具来执行此操作,因为 Code First 背后的想法是您不需要存储过程、触发器或其他任何东西。您只需使用代码优先。当然,这并不总是成立,为此您可以在数据库上运行 SQL。

于 2013-10-21T15:08:12.683 回答