无法在表上创建多个聚簇索引

时间:2016-03-24 19:58:05

标签: c# asp.net migration azure-mobile-services ef-migrations

输入update-database后出现以下错误:

  

无法在表'dbo.AppUsers'上创建多个聚簇索引。删除现有的聚簇索引'PK_dbo.AppUsers',然后再创建另一个。

我正在开发Azure移动服务。

我有三种数据模型:

;WITH c 
     AS (SELECT Dept, 
             Count(*) cnt 
         FROM   Emp 
         GROUP  BY Dept) 
SELECT c.* 
FROM   c 
WHERE  c.cnt = (SELECT Max(cnt) 
            FROM   c) 

它与迁移有关,因为:

  • 初始创建位于 _MigrationHistory 表中,但不在解决方案资源管理器中的迁移文件夹中。
  • 当我添加迁移AddAll时,我没有收到任何错误,并且AddAll出现在迁移文件夹中,但不在表中。

在上下文文件中:

public class AppUser : EntityData
{
    public string Username { get; set; }
    public virtual ICollection<RatingItem> userRatings { get; set; }
}

public class PlaceItem : EntityData
{
    public string PlaceName { get; set; }
    public int Group { get; set; }
    public string XCoordinate { get; set; }
    public string YCoordinate { get; set; }
}

public class RatingItem : EntityData
{
    public int Ratings { get; set; }
    public string PlaceId { get; set; }
    public AppUser user { get; set; }
}

}

2 个答案:

答案 0 :(得分:24)

通常,此错误消息是由未运行移动应用/移动服务数据库生成器引起的。实体框架没有用于创建非主键的聚簇索引的注释,因此移动服务器SDK手动创建正确的SQL语句以将CreatedAt设置为非主键聚簇索引。

要解决此问题,请在应用迁移之前运行数据库生成器。在Migrations\Configuration.cs文件中,包含以下内容:

public Configuration()
{
   AutomaticMigrationsEnabled = false;
   SetSqlGenerator("System.Data.SqlClient", new EntityTableSqlGenerator());
}

要了解详情,请参阅How to make data model changes to a .NET backend mobile service。该主题适用于两者移动服务和移动应用,但移动应用中的某些命名空间不同。

答案 1 :(得分:2)

如@gorillapower在评论中所述,这段代码也非常重要。

modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<TableColumnAttribute, string>( "ServiceTableColumn", (property, attributes) => attributes.Single().ColumnType.ToString()));

在你的

里面
protected override void OnModelCreating(DbModelBuilder modelBuilder)

DbContext配置类中。不要忘记重新生成迁移。