实体框架不接受聚集索引属性

时间:2014-07-12 15:13:31

标签: c# .net entity-framework ef-code-first

我的EF模型中有一个课程:

public class Comment
        {
        public string CommentId { get; set;}
        public string TextMarkdown { get; set;}
        public string TextHtml { get { return new Markdown().Transform(TextMarkdown); } }
        public DateTime DateCreated { get; set; }
        public DateTime DateModified { get; set; }
        public int BlogId { get; set;}
        public virtual Blog BlogOwner { get; set; }
        }

我把课程改为:

public class Comment
        {
        public int CommentId { get; set;}
        public string TextMarkdown { get; set;}
        public string TextHtml { get { return new Markdown().Transform(TextMarkdown); } }
        public DateTime DateCreated { get; set; }
        public DateTime DateModified { get; set; }
        public int BlogId { get; set;}
        public virtual Blog BlogOwner { get; set; }
        }

我正在使用Code First迁移。我发出了这些命令:

  

add-migration“将CommentId更改为int”

     

更新的数据库

update database命令失败并显示错误

  

此版本的版本不支持没有聚簇索引的表   SQL Server。请创建聚簇索引,然后重试。

所以我在CommentId属性上添加了一个Index属性。我删除了上次迁移,再次发出了添加迁移和更新数据库命令。

public class Comment
        {
        [Index(IsClustered = true)]
        public int CommentId { get; set;}
        //rest of class omitted for brevity
        }

但我得到同样的错误。我究竟做错了什么?这是我的迁移代码:

public override void Up()
        {
            DropPrimaryKey("dbo.Comments");
            AlterColumn("dbo.Comments", "CommentId", c => c.Int(nullable: false, identity: true));
            AddPrimaryKey("dbo.Comments", "CommentId");
            CreateIndex("dbo.Comments", "CommentId", clustered: true);
        }

背景:我正在使用EF 6.1.1和Azure中托管的SQL Server数据库。

2 个答案:

答案 0 :(得分:0)

您需要在Comment_Blog关系上使用聚簇索引。在azure中,所有表必须具有聚簇索引(从技术上讲,您可以拥有它们,但不能用于正常使用)。确认/检测此问题的一种方法是部署到本地SQL数据库。然后,您可以运行此处提到的脚本:list of tables without indexes in sql 2008以查找没有索引的表。

答案 1 :(得分:0)

我在创建“注释”表之前最终迁移到了数据库的一个版本。然后我创建了一个新的迁移,以便在创建表时,CommentId将是一个int而不是一个字符串。

我想有关事情的顺序导致问题。好的事我没有在我的数据库中有实时数据,或者我会丢失它。