C# EF代码优先触发器支持的最佳方式

C# EF代码优先触发器支持的最佳方式,c#,sql-server,stored-procedures,triggers,ef-code-first,C#,Sql Server,Stored Procedures,Triggers,Ef Code First,我想我现在有几个类似的问题,但我现在真的对谷歌搜索和阅读感到困惑。因为我有一个代码优先的方法,我添加了迁移支持,更新到数据库,现在我需要一些讨厌的东西,比如触发器、存储过程和视图。据我所知,我需要先将SQL创建触发器和存储过程作为字符串写入我的C#代码中。但是在哪里呢?我需要在哪里添加它们(作为静态或常量字符串)?我还需要写drop触发器/存储的procs字符串吗?如何将它们集成到下一个迁移步骤中?有人知道一个关于这个话题的非常有用的逐步博客吗 我得到一个建议,使用“addmigration”命

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

我得到一个建议,使用“addmigration”命令生成下一个迁移步骤,然后使用触发器定义更新Up()和Down()方法。这很清楚,但与代码优先的观点有点不同,我担心表定义和表触发器(以及存储过程)会被分开。另一个建议是重写modelCreating()上的上下文。。。但我看不到它何时执行,如何链接到特定的迁移步骤


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

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

我必须做的一个有趣的技巧是在脚本文件中放置特殊分隔符,因为GO语句不是T-SQL语句。我使用术语GO--BATCH--作为批处理分隔符,这样它既可以在SQLServerManagementStudio中工作,也可以在代码中工作。在代码中,我只需使用此分隔符拆分脚本,并运行多个查询,如下所示:

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。

Ahm。。。所以建议直接向Up()方法添加新代码。但是,您必须为每次迁移定义不同的脚本文件,例如,您想在以后定义其他触发器吗?并且您将触发器定义存储在远离代码优先源代码的地方。。。我看到了优点和缺点。。。但是谢谢你的回答!:)