在EF6中将单个表的类型nvarchar更改为varchar - 此版本的SQL Server不支持没有聚簇索引的表

时间:2015-12-03 11:47:02

标签: c# sql-server database entity-framework ef-code-first

我正在尝试使用EF6的codefirst迁移将字符串字段的默认列类型更改为我的数据库中特定表(Contacts表)的varchar。

我首先尝试使用以下方法在我的上下文类中实现它:

modelBuilder.Properties<string>().Configure(c => c.HasColumnType("varchar"));

这会尝试将整个db的字符串字段重新映射到varchar并产生冗长的迁移。我已将此迁移用作模板,以生成仅更新Contacts表的列的迁移。我现在有一个迁移:

public override void Up()
    {
        AlterColumn("dbo.Contacts", "FirstName", c => c.String(maxLength: 8000, unicode: false));
        AlterColumn("dbo.Contacts", "LastName", c => c.String(maxLength: 8000, unicode: false));
        AlterColumn("dbo.Contacts", "Company", c => c.String(maxLength: 8000, unicode: false));
        AlterColumn("dbo.Contacts", "Position", c => c.String(maxLength: 8000, unicode: false));
        AlterColumn("dbo.Contacts", "Notes", c => c.String(maxLength: 8000, unicode: false));
    }

public override void Down()
    {
        AlterColumn("dbo.Contacts", "Notes", c => c.String());
        AlterColumn("dbo.Contacts", "Position", c => c.String());
        AlterColumn("dbo.Contacts", "Company", c => c.String());
        AlterColumn("dbo.Contacts", "LastName", c => c.String());
        AlterColumn("dbo.Contacts", "FirstName", c => c.String());
    }

这正是我想要发生的事情,但是在尝试更新我的数据库时,我看到以下错误:

Tables without a clustered index are not supported in this version of SQL Server. 
Please create a clustered index and try again.
Could not drop constraint. See previous errors.
The statement has been terminated.

我不确定这个错误意味着什么,但我想知道是否有一种标准方法可以通过此错误来应用我创建的迁移。

或者有另一种方法可以实现我的目标,即为我的Contacts表设置字符串default to varchar,确保不会影响我当前与代码中表的交互,也不会丢失数据。

值得添加我的SQL数据库托管在Azure中。

0 个答案:

没有答案