最佳方式EF Code First Trigger支持

时间:2013-10-21 14:57:38

标签: c# sql-server stored-procedures triggers ef-code-first

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

我得到了一个建议,即使用“add-migration”命令生成下一个迁移步骤,然后使用触发器定义更新Up()和Down()方法。这很明显,但从代码的第一个角度来看,我担心表定义和表触发器(和存储过程)将被分开。另一个建议是覆盖上下文OnModelCreating()......但是我看不到它何时会执行,如何链接到特定的迁移步骤......

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

1 个答案:

答案 0 :(得分: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背后的想法是你不需要存储过程,触发器或其他任何东西。您只需使用Code First。当然,这并不总是有用水,为此你可以在数据库上运行SQL。