2014-02-12 87 views
12

我首先使用实体​​框架迁移代码来控制我的数据库模型。它工作迷人,我可以处理到现在的一切。但现在我需要添加一个数据库触发器,我想用EF Migrations来做到这一点,而不是为这种情况使用单独的SQL脚本(这会让客户感到困惑,特别是在我们说服他们我们可以处理所有事情之后EF迁移)。 我的触发是直线前进,看起来像那朵:使用实体框架添加数据库触发器代码首先迁移

CREATE OR REPLACE TRIGGER [name] BEFORE UPDATE ON myTable ... 

是否有一个命令来触发增加EF迁移?

+0

退房的解决方案,我想出了:EntityFramework.Triggers(http://github.com/NickStrupat/EntityFramework.Triggers)。它也在NuGet上。 –

+0

看起来很有希望。你知道吗,如果它支持多个数据库系统(oracle,sql server等) – StefanG

+0

我只用SQL Server对它进行了测试,但它都是以与提供者无关的方式构建在Entity Framework之上的。它取决于'DbContext'。 –

回答

23

您可以将Sql("SQL COMMAND HERE")方法调用添加到您的迁移的Up方法中。不要忘记还要将drop语句添加到Down方法中。如果需要,您可以创建一个空迁移,只需运行Add-Migration而不对模型进行任何更改。

public partial class Example : DbMigration 
{ 
    public override void Up() 
    { 
     Sql("CREATE OR REPLACE TRIGGER [name] BEFORE UPDATE ON myTable ..."); 
    } 

    public override void Down() 
    { 
     Sql("DROP TRIGGER [name]"); 
    } 
} 
+1

你也可以添加IF NOT EXISTS(从sys.triggers中选择name ='name')到UP(),以使其幂等。 – eoghank

+13

@eoghank。我不确定我是否同意。迁移的想法是,它们应该在所有方向上都是可重复的,因此它们可以防止这种情况发生。理论上,如果我们需要存在检查,我们没有正确地使用迁移 - 因为我们不检查表的存在,我们不应该为触发器? –

+1

对于EF核心,请使用migrationBuilder.Sql(“blah blah ...”); – wye

相关问题