2014-01-09 40 views
0

我尝试使用迁移将列的数据类型从int更改为字符串,并将枚举的整数值替换为字符串表示形式。实体框架AlterColumn不会在运行查询时更改数据库

我的代码:

AlterColumn("dbo.Tid", "Status", c => c.String(nullable:false)); 

foreach (var status in Enum.GetValues(typeof(TimelisteStatus)).Cast<TimelisteStatus>()) 
{ 
    Sql(String.Format("UPDATE dbo.Tid SET [Status] = '{0}' WHERE [Status] = {1}", status, status.ToString("D"))); 
} 

和输出迁移:

Update-Database -TargetMigration:"0" -verbose 
Target database is: 'AdTid' (DataSource: ., Provider: System.Data.SqlClient, Origin: Configuration). 
Reverting migrations: [201401091224116_Migration 
ALTER TABLE [dbo].[Tid] ALTER COLUMN [Status] [nvarchar](max) NOT NULL 
UPDATE dbo.Tid SET [Status] = 'Kladd' WHERE [Status] = 10 
UPDATE dbo.Tid SET [Status] = 'Avvist' WHERE [Status] = 20 
System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the nvarchar value 'Kladd' to data type int. 

如果我复制粘贴命令到SQL管理器,一切正常,所以我的问题:有没有办法强制在我运行我的更新语句之前提交的ALTER TABLE命令?

+0

ddl语句如'alter table'不需要提交。与你连接你的应用程序到sql server的用户有适当的权利吗? –

+0

刚刚计算出来,UPDATE dbo.Tid SET [Status] ='Kladd'WHERE [Status] = 10需要更新dbo.Tid SET [Status] ='Kladd'WHERE [Status] ='10' For有些原因在管理工作室中有效,但在使用迁移时不适用。 – ruffen

回答

0

愚蠢的错误,但这里有云:

foreach (var status in Enum.GetValues(typeof(TimelisteStatus)).Cast<TimelisteStatus>()) 
{ 
    Sql(String.Format("UPDATE dbo.Tid SET [Status] = '{0}' WHERE [Status] = {1}", status, status.ToString("D"))); 
} 

已进行修改,以:

foreach (var status in Enum.GetValues(typeof(TimelisteStatus)).Cast<TimelisteStatus>()) 
{ 
    Sql(String.Format("UPDATE dbo.Tid SET [Status] = '{0}' WHERE [Status] = '{1}'", status, status.ToString("D"))); 
} 

这再次创建SQL:

UPDATE dbo.Tid SET [Status] = 'Kladd' WHERE [Status] = '10' 

,而不是

UPDATE dbo.Tid SET [Status] = 'Kladd' WHERE [Status] = 10 

为什么第二个声明在管理工作室中有效,但不是在我真正无法回答的迁移中。发生这个问题是因为我在运行Update语句之前将列更改为varchar列,并且10不再是整数,而是字符串“10”。