Ошибка при активации первых кодов миграции в базе данных мобильных служб

У меня есть проект Azure Mobile Services (С# backend), который я недавно создал и подключил к базе данных Azure SQL. Я пытаюсь включить Перенос кодов в эту базу данных резервного копирования, но при попытке обновить базу данных он вызывает ошибки.

Я выполнил все обычные шаги для включения миграции (Enable-Migrations, Add-Migration). Но когда я пытаюсь обновить базу данных, она возвращает следующую ошибку:

Невозможно создать более одного кластерного индекса в таблице "dbo.Appointments". Перед созданием другого существующего кластерного индекса "PK_dbo.Appointments" удалите существующий кластер.

Почему это происходит? В моей базе данных нет таблиц, и проект в значительной степени по умолчанию.

Ответ 1

Некоторые из ответов о создании пользовательского класса объектов будут работать, но они не являются идеальным решением. Как упомянула команда EF (и другие), вам нужно просто добавить эту строку в свой конструктор конфигурации контекста.

 SetSqlGenerator("System.Data.SqlClient", new EntityTableSqlGenerator());

Это приведет к удалению ваших ошибок при создании миграции и позволит вам обновить базу данных с помощью команды powershell.

Ответ 2

Если вы получаете эту ошибку в базе данных обновлений после создания класса миграции, то посмотрите @свой класс миграции. Класс миграции будет первичным кластеризованным индексом. Поэтому удалите это из метода up().

.PrimaryKey(t = > t.Id, clustered: false)               .Index(t = > t.CreatedAt, clustered: true);

Если вы используете его на мобильной службе azure, не вызывайте "update-database" вручную. refer http://azure.microsoft.com/en-in/documentation/articles/mobile-services-dotnet-backend-how-to-use-code-first-migrations/

Ответ 3

Я боролся с этой проблемой сегодня в течение нескольких часов. Пока я не нашел эту ссылку:

Как внести изменения в модель данных в мобильную службу .NET backend

Если вы будете следовать инструкциям, это определенно будет работать. Главное, чтобы миграция произошла, когда вы нажмете F5 во время локальной сессии отладки.

Ответ 4

У меня была такая же проблема.

Это вызвано определением EntityData, которое является нашим базовым классом:

public class OrgTest : EntityData
{
    public string Prop1 { get; set; }
}

Я заменил EntityData своей собственной реализацией "CustomEntity", где я удалил атрибут [Index (IsClustered = true)] в столбце CreatedAt:

public abstract class CustomEntity : ITableData
{
   // protected CustomEntity();

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [TableColumn(TableColumnType.CreatedAt)]
    public DateTimeOffset? CreatedAt { get; set; }
    [TableColumn(TableColumnType.Deleted)]
    public bool Deleted { get; set; }
    [Key]   
    [TableColumn(TableColumnType.Id)]
    public string Id { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    [TableColumn(TableColumnType.UpdatedAt)]
    public DateTimeOffset? UpdatedAt { get; set; }
    [TableColumn(TableColumnType.Version)]
    [Timestamp]
    public byte[] Version { get; set; }
} 

и теперь я наследую это:

public class OrgTest : CustomEntity   // EntityData
{
    public string Prop1 { get; set; }
}

Возможно, у меня будут проблемы, но пока я смогу создать свою модель! Надеюсь, вы тоже можете начать так!