Ошибка при активации первых кодов миграции в базе данных мобильных служб
У меня есть проект 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; }
}
Возможно, у меня будут проблемы, но пока я смогу создать свою модель!
Надеюсь, вы тоже можете начать так!
Ответ 5
См. статью:
избегать кошмаров, используя первую миграцию ef в лазурных мобильных сервисах
EntityData определяет кластер indext для CreateAt, а Id по умолчанию является индексом кластера, таким образом он обеспечивает ошибку, и вы должны определить только один.