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

11

在输入update-database之后,我遇到了以下错误:

无法在表'dbo.AppUsers'上创建多个聚集索引。在创建其他聚集索引之前,请删除现有的聚集索引'PK_dbo.AppUsers'。

我正在使用Azure移动服务。

我有三个数据模型:

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; }
}

涉及迁移,因为:

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

在上下文文件中:

public class ICbackendContext : DbContext
{
        public DbSet<AppUser> AppUsers { get; set; }
        public DbSet<PlaceItem> PlaceItems { get; set; }
        public DbSet<RatingItem> RatingItems { get; set; }

}

2个回答

29

通常,这个错误信息是由于没有运行移动应用程序/移动服务数据库生成器引起的。Entity Framework没有为创建非主键群集索引的注释,因此移动服务器SDK手动创建正确的SQL语句来将 CreatedAt 设置为非主键群集索引。

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

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

要了解更多信息,请参阅如何对.NET后端移动服务进行数据模型更改。该主题适用于Mobile Services和Mobile Apps,但在Mobile Apps中一些命名空间不同。


我应该只使用它一次吗?我想我第一次忘记运行 Database.SetInitializer,直接注释并创建了一个 DBMigrator。 - Elie Saad
这段代码应该写在你的配置文件中,这样每次进行迁移时它都会被执行。 - lindydonna
1
哇,这就是黑魔法了。(在我的情况下,我正在尝试将Azure移动应用程序添加到现有的EF数据库中) - tofutim
1
@lindydonna-msft 我在配置文件中也有完全相同的一行,但我仍然遇到了这个错误。你有任何想法是出了什么问题吗? - user963935
@user963935 在生成代码的第一个迁移时,请确保在您的 DbContext 配置类的 protected override void OnModelCreating(DbModelBuilder modelBuilder) 方法中添加以下代码:modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<TableColumnAttribute, string>("ServiceTableColumn", (property, attributes) => attributes.Single().ColumnType.ToString()));。这将生成正确的迁移代码。我已经验证过了。 - gorillapower
实际上,我的最终解决方案是在一个新的解决方案中使用OfflineSync - 所有错误都消失了。 - user963935

2

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

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

在您的内部
protected override void OnModelCreating(DbModelBuilder modelBuilder)

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

找不到TableColumnAttribute。它在哪里? - Chuck D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接