EF 代码第一个触发器支持的最佳方式

本文关键字:最佳 方式 支持 触发器 代码 第一个 EF | 更新日期: 2023-09-27 18:36:11

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

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

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

EF 代码第一个触发器支持的最佳方式

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

我必须做的一个有趣的技巧是在脚本文件中放置特殊的分隔符,因为 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。