Отключить автоматическую миграцию в структуре объекта - PullRequest
0 голосов
/ 04 июня 2018

У меня есть Конфигурация конструктор класса, подобный этому:

public Configuration() => AutomaticMigrationsEnabled = false;

И я даже обновил свой DbContent до этого:

public DatabaseContext()
    : base("DefaultConnection")
{
    Database.CommandTimeout = 900;
    Database.Log = s => Debug.WriteLine(s);
    Configuration.LazyLoadingEnabled = false;
    Database.SetInitializer(new CreateDatabaseIfNotExists<DatabaseContext>());
}

Но когда я пытаюсь запустить update-database для конкретной миграции:

update-database -TargetMigration CreateOrganisation

я получаю это:

Применение явных миграций: [201805081508118_CreateOrganisation].

Применение явной миграции: 201805081508118_CreateOrganisation.

Применение автоматической миграции: 201805081508117_CreateOrganisation_AutomaticMigration.

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

* 1026System.Data.SqlClient.SqlException (0x80131904): В базе данных уже есть объект с именем «Ответы».

Да, но фактическая миграция выглядит следующим образом:

public partial class CreateOrganisation : DbMigration
{
    public override void Up()
    {
        CreateTable(
                "dbo.Organisations",
                c => new
                {
                    Id = c.String(nullable: false, maxLength: 100),
                    Name = c.String(nullable: false, maxLength: 100),
                    Description = c.String(maxLength: 255),
                })
            .PrimaryKey(t => t.Id);

        AddColumn("dbo.Users", "OrganisationId", c => c.String(maxLength: 100));
    }

    public override void Down()
    {
        DropTable("dbo.Organisations");
        DropColumn("dbo.Users", "OrganisationId");
    }
}

Как видите, в этой миграции нет упоминания Ответ , что заставляет меня предположить, что она пытается выполнить предыдущие миграции ....

Кто-нибудьзнаю, как я могу остановить тшапка?


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Table renames
    modelBuilder.Entity<Criteria>().ToTable("Criteria");
    modelBuilder.Entity<Formula>().ToTable("Formulas");
    modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
    modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
    modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
    modelBuilder.Entity<ImageText>().ToTable("ImageText");

    // One to Many  
    modelBuilder.Entity<Criteria>().HasMany(m => m.Attributes).WithOptional().HasForeignKey(m => m.CriteriaId);
    modelBuilder.Entity<IdentityRole>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.RoleId);
    modelBuilder.Entity<Organisation>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.OrganisationId);
    modelBuilder.Entity<Organisation>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.OrganisationId);
    modelBuilder.Entity<Group>().HasMany(m => m.Questions).WithOptional().HasForeignKey(m => m.GroupId);
    modelBuilder.Entity<Question>().HasMany(m => m.Answers).WithOptional().HasForeignKey(m => m.QuestionId);

    modelBuilder.Entity<Category>().HasMany(m => m.PriorityColours).WithRequired().HasForeignKey(m => m.CategoryId);
    modelBuilder.Entity<Category>().HasMany(m => m.Criteria).WithRequired().HasForeignKey(m => m.CategoryId);
    modelBuilder.Entity<Category>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.CategoryId);
    modelBuilder.Entity<Category>().HasMany(m => m.Quotes).WithRequired().HasForeignKey(m => m.CategoryId);
    modelBuilder.Entity<Category>().HasMany(m => m.QuestionGroups).WithRequired().HasForeignKey(m => m.CategoryId);

    modelBuilder.Entity<User>().HasMany(m => m.Searches).WithRequired().HasForeignKey(m => m.UserId);
    modelBuilder.Entity<User>().HasMany(m => m.Charges).WithRequired().HasForeignKey(m => m.UserId);
    modelBuilder.Entity<Answer>().HasMany(m => m.Images).WithRequired().HasForeignKey(m => m.AnswerId);
    modelBuilder.Entity<Image>().HasMany(m => m.ImageText).WithRequired().HasForeignKey(m => m.ImageId);

    // Create our primary keys
    modelBuilder.Entity<IdentityUserLogin>().HasKey(m => m.UserId);
    modelBuilder.Entity<IdentityRole>().HasKey(m => m.Id);
    modelBuilder.Entity<IdentityUserRole>().HasKey(m => new {m.RoleId, m.UserId});
}

По запросу

1 Ответ

0 голосов
/ 23 января 2019

Кажется, вы столкнулись с той же проблемой, что и я, и я нашел ответ в приведенной ниже ссылке, это работа для меня, и надеюсь, что это также работает для вас:

Update-Database пытается сделатьавтоматическая миграция даже при отключенных автоматических миграциях

Важная часть ответа, которую я копирую сюда:

Платформа Entity Framework всегда запускает автоматическую миграцию, прежде чем запустить явную миграциюсвойство Source определено в его файле .resx, даже если AutomaticMigrationsEnabled = false.Для явной миграции будет установлено свойство Source только в том случае, если оно создано после запуска автоматической миграции.

В результате отключение автоматической миграции означает только то, что EF не будет автоматически обновлять вашу схему при обнаружении моделиизменения - но он все равно может выполнять автоматическую миграцию, если ему необходимо заполнить пробел между некоторыми явными миграциями.Чтобы избежать такого поведения, не используйте смесь автоматических миграций и явных миграций.

И вот что я сделал для решения этой проблемы:

  • найдите файл resx отсутствующего файла миграции
  • , откройте его и удалите свойство источника.лучше сделать копию этого файла resx.
  • снова запустить команду update-database -verbose.
  • ожидающая миграция добавит таблицу _migrationHistory.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...