У меня есть забавный эффект, используя миграцию (EF 5.0) и первый код:
Я создал несколько моделей с первичными ключами GUID. (Кстати: для меня важно, чтобы SQL Server использовал NEWSEQUENTIALID()
, который, по-видимому, является значением по умолчанию в текущей версии)
В какой-то момент я активировал миграции. Я добавил некоторый код в начальную миграцию, в основном это .Index()
мере необходимости.
Когда я удаляю базу данных и вызываю update-database, я получаю следующую ошибку:
Невозможно обновить базу данных в соответствии с текущей моделью, поскольку есть ожидающие изменения и автоматическая миграция отключена. Либо запишите ожидающие изменения модели в миграцию на основе кода, либо включите автоматическую миграцию. Установите в DbMigrationsConfiguration.AutomaticMigrationsEnabled значение true, чтобы включить автоматическую миграцию. Вы можете использовать команду Add-Migration для записи ожидающих изменений модели в миграцию на основе кода.
Я попытался AutomaticMigrationsEnabled = true
, который работал без изменения или добавления чего-либо!
Но так как я не хочу AutomaticMigrationsEnabled
, я также попытался снова удалить базу данных, которая называется update-database
и затем add-migration
. Я закончил с дополнительной миграцией, которая, кажется, ничего не меняет (см. Ниже). Я также попытался добавить эти строки в конец начальной миграции, но это ничего не меняет.
Одна из моделей:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
Исходный код миграции:
public partial class InitialCreate : DbMigration
{
public override void Up()
{
// [...]
CreateTable(
"dbo.Speaker",
c => new
{
Id = c.Guid(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, true, false); // added manually: unique Name
// [...]
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyProject.Repositories.DBContext context)
{
// ...
}
}
Ниже приведен код, созданный с помощью add -igration: похоже, он ничего нового не делает - может быть, я что-то упустил?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
Поэтому мне любопытно: что я сделал, чтобы дезориентировать миграции? И что я могу сделать, чтобы заставить его работать только с одной начальной миграцией?
Решение: Следующий обходной путь сделал это для меня:
- Я удалил базу данных и все миграции, как описано здесь: qaru.site/info/28073/...
- Выполнено Enable-Migrations + Add-Migration Initial
- Слил мои изменения .Index() ручной работы в файл. Теперь Update-Database работает снова - также многократно, при удалении базы.