2017-07-25 93 views
0

我需要执行原始SQL作为使用实体框架进行数据库初始化的一部分。在SQL需要设置列的排序规则,并给出一个上下文时的代码看起来是这样的在实体框架迁移上执行原始SQL

context.Database.ExecuteSqlCommand("ALTER TABLE my_table ALTER COLUMN my_column nvarchar(200) COLLATE Latin1_General_CS_AS"); 

的问题是在哪里把这个代码?如果我将它放在方法Configuration.cs的EF创建的时候,我可以工作,但如果我决定在以后删除迁移和重新定义标记,我将失去执行SQL的所有知识。理想情况下,我希望将此SQL执行抽象为EF知道要在每次启用迁移和更新数据库时执行的另一个类。

我曾考虑过使用database initializer,但在进一步阅读时,似乎这些仅由调用应用程序调用:这不应该是调用应用程序的责任 - 我希望它在实体框架创建时设置排序规则数据库。

如何确保我将原始SQL作为EF初始/基线配置的一部分执行,以便我不会丢失对未来所做工作的知识(即,不仅仅将它全部纳入到种子方法中默认Configuration.cs

回答

0
void Up() { 
    Sql("ALTER TABLE my_table ALTER COLUMN my_column nvarchar(200) COLLATE Latin1_General_CS_AS"); 
} 

另一种选择是做种子法的一部分,但移民似乎更理智。

+0

当然,但嵌入此迁移的唯一方法?首次构建数据库时,我经常发现自己清理迁移并开始新鲜事,否则最终会产生大量迁移,随着模型的发展,这些迁移实际上只是噪声。我不得不记得每次添加这些sql语句。 –

+0

你有没有找到另一个解决方案呢,@JamesB? – Dustin