Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Entity Framework автоматическая миграция

Добрый день!

В своём проекте использую EF Code First. Изначально всё было настроено и несколько месяцев отработало нормально, но недавно появилась проблема.
Проблема с следующем:
На локальном компьютере были внесены изменения в Code First модель БД, с помощью автоматической миграции они были успешно применены к самой БД. При загрузке на реальный сервер появилась ошибка и изменения не были применены. Суть ошибки уже не помню. Но спустя какое-то время они всё же применились, но при перезагрузки сайта появляется ошибка, что таблица уже существует (пытается сработать автоматическая миграция). Появляется она один раз при запуске сайта и сильно не мешает, но сегодня было замечено, что новые миграции так-же не применяются.
Вопрос: как дать знать приложению, что автоматическая миграция применилась? (что-нибудь в БД изменить, в проекте), пробовал удалять из таблицы Миграций все строки - пишет ошибки, пытается применить какие-то миграции. Или может быть есть какое-то другое решение?
Ответ: автоматические миграции - зло.
Но коли вам от них уже не избавиться, то можно сравнить таблицы MigrationHistory у себя локально, и на сервере. Если локально у вас нет ошибок, и на сервере изменения в таблицах были произведены, то можно попробовать перенести всё то, что у вас в MigrationHistory на сервер.
Вопрос: Laravel 5.4: создание модели и миграция

Изучаю Laravel, тренируюсь на default модели.
Создаю модель Post: php artisan make:model Post
Потом добавил миграцию: php artisan make:migration Post
добавляю поля в миграцию:
PHP
1
2
3
4
5
6
7
8
9
10
Schema::create('posts', function(Blueprint $table){
            $table->increments('id');
            $table->string('title')->nullable();    // заголовок
            $table->string('slug')->unique();       // алиас
            $table->text('excerpt')->nullable();    //
            $table->text('content')->nullable();    // статья
            $table->timestamp('published_at');  // дата ->nullable()
            $table->boolean('published')->default(false);   // публикация 
            $table->timestamps();
        });
Выполняю миграцию: php artisan migrate, создается таблицы users и migrations, таблица Post не создается.

Удаляю файл модели, файл миграции и в БД таблицы. Делаю все заново, но создаю модель сразу с миграцией:
php artisan make:model Post -m, но при этом получаю ошибку:
[ErrorException]
include(D:\Wamp_3.0.6\www\laravel.loc\vendor\composer/../../database/migrations/2017_02_12_153810_Post.php): failed
to open stream: No such file or directory
Файл 2017_02_12_153810_Post.php восстановил. выполняю заново:
Migration table created successfully.

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (S
QL: alter table `users` add unique `users_email_unique`(`email`))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
создается таблицы users и migrations, таблица Post не создается
Ответ:
Сообщение от Worldmen
но при этом получаю ошибку
После удаления файла миграции выполняйте эту команду:
Код
php composer.phar dumpautoload
Сообщение от Worldmen
Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
А вот это уже из-за версии MySQL. Laravel 5.4 использует кодировку utf8mb4, которая была введена в MySQL 5.5:


Решение: как сказал Yarusha, либо добавить строку в метод boot AppServiceProvider:
PHP
1
Schema::defaultStringLength(191);
Вопрос: Миграция базы - при локальной публикации

Доброго всем.
Человеки - подскажите пожалуйста простом языком. Если я локально публикую, функции нет Выполнять миграции Code First. Что делать в этом случаи?
Весь вечер ищу. Дроп базы? каждый раз
Ответ: Это я уже понял, дав только, зафигачил проект это миграцией, удил папку миграция и проект не билдедсяЮ пришлось откатывать версию, как удалить миграцию с проект так и не нашел нигде, все-равно где-то ссылки на миграции фыйлы остались. Скрипт хорошо конеч, но я по старинке, руками лучше скрипт напишу, не доверяю я всяким визардам еще после создания датасетов колдуном для базы
Вопрос: EF миграция из проекта с тестами

Есть проект c db-контекстом и ef-миграциями, сгенеренными на основе db-контекста. Базу обновляю из Package Manager Console Update-Database.

Хочу иметь другой проект с тестами, который ссылается на первый. В нем будет свой connection-script к тестовой базе. Так же хочу чтоб все миграции можно было запустить для тестовой базы.

Поигрался скриптами типа

Update-Database -Verbose 
 -ConnectionString "<строка подключения из проекта с тестами>" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName "<имя проекта с тестами>" -ProjectName "<имя проекта с миграциями>"


Ошибка - Format of the initialization string does not conform to specification starting at index 0.

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

моя ошибка была в том, что задал параметр ConnectionString значением, которое означало имя строки подключения.

Нужно было использовать параметр ConnectionStringName. Работает как надо )
Вопрос: Слетели миграции - что делать?

База рабочая, данные терять нельзя.

Внес изменения в код, отрефакторил приложение.

Добавляю миграцию - вываливается с ошибкой

Unable to generate an explicit migration because the following explicit migrations are pending:

А pending-то все миграции, которые были с самого начала.

Я посмотрел в таблицу миграций - они там все конечно есть.

Что делал подозрительного - поменял фреймворк с 4.5.1 до 4.6

Что делать теперь?

Просится:

1. Грохнуть все миграции
2. Сгенерить самую первую.
3. Удалить её тело.
4. Сделать update.

Но проблема с внес изменения в код, отрефакторил приложение. Рефакторить обратно? Это депрессия.
Ответ: Monochromatique,

не забывай устанавливать проект по умолчанию, где находится контекст и миграции, а также стартап проект, где находятся конфиги :)
Вопрос: Миграции

Достался проект, в котором много файлов миграции.
При выставлении AutomaticMigrationsEnabled = true; Все файлы выполнятся?
Ответ: Pavluha,

AutomaticMigrationEnables это из другой области. Рекомендую выставить в false. Автоматические миграции удобны только для тестовых, демонстрационных и учебных проектов. В боевом применении не практичны, миграции лучше создавать командой Add-Migration, затем инспектировать полученный код, при необходимости вносить исправления, дописывать миграцию данных и другой код.
Вопрос: c# ef code first вопрос по миграции

Здравствуйте!

Здесь опишу суть вопроса, а снизу приложу исходники.
Выполняю миграцию данной структуры (add-migration), и у меня возникает вопрос. Почему ef названия таблиц делает разнородными
dbo.MessageBookOneBookOnes
dbo.BookTwoMessageBookTwoes

а не так:
dbo.MessageBookOneBookOnes
dbo.MessageBookTwoBookTwoes
?

Что я пробовал
Я в сгенерированном коде (add-migration), менял ручками названия таблиц на:
dbo.MessageBookOneBookOnes
dbo.MessageBookTwoBookTwoes
после выполнил Update-Database. Миграция прошла успешно.

Далее начал проверять работу запросами.
var query1 = context.Set<BookTwo>().ToList(); // Выполнился успешно
var query2 = context.Set<BookTwo>().Include("Message").ToList(); // Выполнился с ошибкой
Текст ошибки: Invalid object name 'dbo.BookTwoMessageBookTwoes'.

Выходит изменения названия таблиц в миграции не помогли. Ef все равно ищет таблицу dbo.BookTwoMessageBookTwoes. Почему так происходит?



[Table("Message", Schema = "dbo")]
public class Message 
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<MessageReference> MessageReference { get; set; }
}
public abstract class MessageReference
{
    public int Id { get; set; }
    public int MessageId { get; set; }
    public Message Message { get; set; }
    public abstract object ReferenceBook { get; }
}
public class MessageBookOne : MessageReference
{
    public virtual ICollection<BookOne> BookOne { get; set; }
    public override object ReferenceBook
    {
        get { return BookOne.FirstOrDefault(); }
    }
}
public class MessageBookTwo : MessageReference
{
    public virtual ICollection<BookTwo> BookTwo { get; set; }
    public override object ReferenceBook
    {
         get { return BookTwo.FirstOrDefault(); }
    }
}
[Table("BookOne", Schema = "dbo")]
public class BookOne
{
    [Key]
    public int Id { get; set; }
    public virtual ObservableCollection<MessageBookOne> Message { get; set; }
}
[Table("BookTwo", Schema = "dbo")]
public class BookTwo 
{
    [Key]
    public int Id { get; set; }
    public virtual ObservableCollection<MessageBookTwo> Message { get; set; }
}


public override void Up()
        {
            CreateTable(
                "dbo.BookOne",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.MessageReferences",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        MessageId = c.Int(nullable: false),
                        Discriminator = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Message", t => t.MessageId, cascadeDelete: true)
                .Index(t => t.MessageId);
            
            CreateTable(
                "dbo.Message",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.BookTwo",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.MessageBookOneBookOnes",
                c => new
                    {
                        MessageBookOne_Id = c.Int(nullable: false),
                        BookOne_Id = c.Int(nullable: false),
                    })
                .PrimaryKey(t => new { t.MessageBookOne_Id, t.BookOne_Id })
                .ForeignKey("dbo.MessageReferences", t => t.MessageBookOne_Id, cascadeDelete: true)
                .ForeignKey("dbo.BookOne", t => t.BookOne_Id, cascadeDelete: true)
                .Index(t => t.MessageBookOne_Id)
                .Index(t => t.BookOne_Id);
            
            CreateTable(
                "dbo.BookTwoMessageBookTwoes",
                c => new
                    {
                        BookTwo_Id = c.Int(nullable: false),
                        MessageBookTwo_Id = c.Int(nullable: false),
                    })
                .PrimaryKey(t => new { t.BookTwo_Id, t.MessageBookTwo_Id })
                .ForeignKey("dbo.BookTwo", t => t.BookTwo_Id, cascadeDelete: true)
                .ForeignKey("dbo.MessageReferences", t => t.MessageBookTwo_Id, cascadeDelete: true)
                .Index(t => t.BookTwo_Id)
                .Index(t => t.MessageBookTwo_Id);
            
        }
Ответ:
Nechto
В общем хрен поймешь как работает этот ef. Если я на втором этапе меняю названия таблиц, а он только на третьем этапе сохраняет версию миграции. То зачем тогда нужен этот сгенерированный класс с методами Up() Down().


Лучше не менять названия таблиц в Up/Down скриптах, ручные изменения нигде не запоминаются. Обычно в Up/Down скриптах добавляются кастомные SQL-скрипты, апдейты данных и т.п., создание вьюх, процедур, тонких хинтов и прочее. Но сгенерированные наименования таблиц и полей.
Вопрос: как запустить одну корректную миграцию

Не могу запустить миграцию 2014_10_12_100000_create_password_resets_table

php artisan migrate - выполняется только миграция таблц users
Ответ:
Сообщение от Artur zhitkovic
везде ответ такой
Иным он быть и не может. Потому что тут явно скрипт не видит новую миграцию.
Сообщение от Artur zhitkovic
Could not open input file: composer
Установите файл composer.phar по инструкции отсюда:
Затем поместите его рядом с файлом "composer.json" (если изначально установили не туда) и выполните команду:
Код
php composer.phar dumpautoload
Не забудьте в консоли зайти именно в ту папку, где лежит composer.phar
Вопрос: Entity Framework 6.2, миграция, шок и трепет...

Entity Framework 6.2

Модель:
    public class personal
    {
        public int? ID { get; set; }

        public byte[] TimeS { get; set; }

        public string LastName { get; set; }

        public string FirstName { get; set; }

        public string PatrName { get; set; }

        public int? TabNum { get; set; }

        public DateTime? EntranceDate { get; set; }

        public DateTime? RetireDate { get; set; }

        public string Notes { get; set; }

        internal class Metadata : EntityTypeConfiguration<personal>
        {
            public Metadata()
            {
                HasKey(t => t.ID);
                Property(t => t.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                Property(t => t.TimeS).IsRowVersion();
                Property(t => t.LastName).IsRequired().HasMaxLength(50);
                Property(t => t.FirstName).IsRequired().HasMaxLength(50);
                Property(t => t.PatrName).IsRequired().HasMaxLength(50);
                Property(t => t.TabNum).IsRequired();
                HasIndex(t => new { t.LastName, t.TabNum, t.FirstName, t.PatrName }).IsUnique().HasName("IX_personal_name");
                HasIndex(t => t.TabNum).HasName("IX_personal_TabNum");
            }
        }
    }

Миграция:
              CreateTable(
                "dbo.personal",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        TimeS = c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"),
                        LastName = c.String(nullable: false, maxLength: 50),
                        FirstName = c.String(nullable: false, maxLength: 50),
                        PatrName = c.String(nullable: false, maxLength: 50),
                        TabNum = c.Int(nullable: false),
                        EntranceDate = c.DateTime(),
                        RetireDate = c.DateTime(),
                        Notes = c.String(),
                    })
                .PrimaryKey(t => t.ID)
                .Index(t => new { t.LastName, t.FirstName, t.PatrName }, unique: true, name: "IX_personal_name")
                .Index(t => t.TabNum, name: "IX_personal_TabNum");

В чём проблема создать индекс IX_personal_name именно такой, как я хочу?

вроде что-то похожее. Про "closed-by-design" не понял...
Ответ:
Алексей К
Я про все индексы и не говорю. Ну обычные-то индексы вполне можно, это уже что-то. :-)


в целом согласен, авто-миграция всяко лучше ручной. мы, кстати, в своё время понаписали много всяких соглашений, покрывающих весь «нестандарт», кроме CTE. правда уже не уверен, оправданно ли это было :)
Вопрос: Миграции mysql

Господа посдкажите, не могу понять что такое миграции в mysql, или это относиться к какому нибудь фраемворку? Я знаю что есть миграции в yii2, но допустим я работаю с modx revo 2.2, мне нужно в бд сделать несколько update`ов например, я делаю файл db_update.sql там пишу свои запросы, в корне создаю папку migrations (например) это будет считаться миграццией?
Или мне например нужно какой нибудь исполняемый файл сделать (set.cmd) который подключается к бд и потом выполняет мои запросы, запускается по команде bash set.cmd или создать файл (set.php) и выполнять по команде ./set.php install?

P.S. Пробовал гуглить на запросы аля миграции mysql или миграции modx revo ничего понятного не нашел, зато куча тем тип миграции в yii и т.д.

Это сообщение отредактировал clocwerk - 25.09.2015 - 11:57
Ответ: Спасибо огромное! Теперь только понял что это и как использовать