Поиск…


Включить миграцию

Чтобы включить первичные миграции кода в инфраструктуре сущности, используйте команду

Enable-Migrations

на консоли диспетчера пакетов .

Вы должны иметь действительную реализацию DbContext содержащую объекты базы данных, управляемые EF. В этом примере контекст базы данных будет содержать объекты BlogPost и Author :

internal class DatabaseContext: DbContext
{
    public DbSet<Author> Authors { get; set; }

    public DbSet<BlogPost> BlogPosts { get; set; }
}

После выполнения команды должен появиться следующий вывод:

PM> Enable-Migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project <YourProjectName>.
PM>

Кроме того, новая папка Migrations должна появиться с одним файлом Configuration.cs внутри: Схема проекта БД

Следующим шагом будет создание первого скрипта миграции базы данных, который создаст исходную базу данных (см. Следующий пример).

Добавьте первую миграцию

После того, как вы включили миграции (см. Этот пример ), теперь вы можете создать первую миграцию, содержащую первоначальное создание всех таблиц базы данных, индексов и соединений.

Миграция может быть создана с помощью команды

Add-Migration <migration-name>

Эта команда создаст новый класс, содержащий два метода Up и Down , которые используются для применения и удаления миграции.

Теперь примените команду, основанную на примере выше, чтобы создать миграцию с именем Initial :

PM> Add-Migration Initial
Scaffolding migration 'Initial'.
The Designer Code for this migration file includes a snapshot of your current Code
First model. This snapshot is used to calculate the changes to your model when you
scaffold the next migration. If you make additional changes to your model that you 
want to include in this migration, then you can re-scaffold it by running 
'Add-Migration Initial' again.

Создается новая временная метка файла _Initial.cs (здесь показан только важный материал):

public override void Up()
{
   CreateTable(
       "dbo.Authors",
        c => new
           {
               AuthorId = c.Int(nullable: false, identity: true),
               Name = c.String(maxLength: 128),
           })
        .PrimaryKey(t => t.AuthorId);
        
    CreateTable(
       "dbo.BlogPosts",
       c => new
           {
                Id = c.Int(nullable: false, identity: true),
                Title = c.String(nullable: false, maxLength: 128),
                Message = c.String(),
                Author_AuthorId = c.Int(),
            })
        .PrimaryKey(t => t.Id)
        .ForeignKey("dbo.Authors", t => t.Author_AuthorId)
        .Index(t => t.Author_AuthorId);
}
    
public override void Down()
{
    DropForeignKey("dbo.BlogPosts", "Author_AuthorId", "dbo.Authors");
    DropIndex("dbo.BlogPosts", new[] { "Author_AuthorId" });
    DropTable("dbo.BlogPosts");
    DropTable("dbo.Authors");
}

Как вы можете видеть, в методе Up() создаются две таблицы Authors и BlogPosts и BlogPosts создаются поля. Кроме того, связь между двумя таблицами создается путем добавления поля Author_AuthorId . С другой стороны метод Down() пытается отменить действия миграции.

Если вы уверены в своей миграции, вы можете применить миграцию к базе данных с помощью команды:

Update-Database

Все ожидающие миграции (в этом случае Initial -migration) применяются к базе данных, а затем применяется метод семени (соответствующий пример)

PM> update-database
Specify the '-Verbose' flag to view the SQL statements being applied to the target     
database.
Applying explicit migrations: [201609302203541_Initial].
Applying explicit migration: 201609302203541_Initial.
Running Seed method.

Вы можете увидеть результаты действий в SQL Explorer: обзор базы данных

Для команд Add-Migration и Update-Database доступны несколько параметров, которые можно использовать для настройки действий. Чтобы просмотреть все варианты, используйте

get-help Add-Migration

а также

get-help Update-Database

Посещение данных во время миграции

После включения и создания миграций может потребоваться первоначальное заполнение или миграция данных в вашей базе данных. Существует несколько возможностей, но для простых перемещений вы можете использовать метод Seed () в файле Configuration, созданный после вызова enable-migrations .

Функция Seed() извлекает контекст базы данных, поскольку это единственный параметр, и вы можете выполнять операции EF внутри этой функции:

protected override void Seed(Model.DatabaseContext context);

Вы можете выполнять все виды действий внутри Seed() . В случае сбоя полная транзакция (даже исправленные исправления) откат.

Примерная функция, которая создает данные только в том случае, если таблица пуста, может выглядеть так:

protected override void Seed(Model.DatabaseContext context)
{
    if (!context.Customers.Any()) {
        Customer c = new Customer{ Id = 1, Name = "Demo" };
        context.Customers.Add(c);
        context.SaveData();
    }
}

AddOrUpdate() функцией, предоставляемой разработчиками EF, является метод расширения AddOrUpdate() . Этот метод позволяет обновлять данные на основе первичного ключа или вставлять данные, если он еще не существует (пример берется из сгенерированного исходного кода Configuration.cs):

protected override void Seed(Model.DatabaseContext context)
{
    context.People.AddOrUpdate(
      p => p.FullName,
      new Person { FullName = "Andrew Peters" },
      new Person { FullName = "Brice Lambson" },
      new Person { FullName = "Rowan Miller" }
    );
}

Имейте в виду, что Seed() вызывается после применения последнего патча. Если вам нужно выполнить миграцию или данные семян во время патчей, необходимо использовать другие подходы.

Использование Sql () во время миграции

Например: вы собираетесь перенести существующий столбец из необязательного требуемого. В этом случае вам может потребоваться заполнить некоторые значения по умолчанию в вашей миграции для строк, где измененные поля фактически являются NULL . Если значение по умолчанию простое (например, «0»), вы можете использовать свойство default или defaultSql в определении столбца. Если это не так просто, вы можете использовать функцию Sql() функциях члена Up() или Down() ваших миграций.

Вот пример. Предполагая класс Author, который содержит адрес электронной почты как часть набора данных. Теперь мы решили указать адрес электронной почты как обязательное поле. Чтобы перенести существующие столбцы, у бизнеса есть умная идея создания фиктивных адресов электронной почты, таких как [email protected] , где полное имя - полное имя авторов без пробелов. Добавление атрибута [Required] в поле « Email создало бы следующую миграцию:

public partial class AuthorsEmailRequired : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(nullable: false, maxLength: 512));
    }
    
    public override void Down()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(maxLength: 512));
    }
}

Это может привести к сбою в случае, если в базу данных находятся некоторые поля NULL:

Невозможно вставить значение NULL в столбец «Электронная почта», таблица «App.Model.DatabaseContext.dbo.Authors»; столбец не допускает нулей. Ошибка UPDATE.

Добавьте следующее, как до того, AlterColumn команда AlterColumn поможет:

Sql(@"Update dbo.Authors
    set Email = REPLACE(name, ' ', '') + N'@example.com'
    where Email is null");

Вызов службы update-database преуспевает, и таблица выглядит так (пример показывает данные):

Пример данных автора

Другое использование

Вы можете использовать функцию Sql() для всех типов действий DML и DDL в вашей базе данных. Он выполняется как часть транзакции миграции; Если SQL сбой, полная миграция завершается с ошибкой и выполняется откат.

Выполнение «Обновить-База данных» в вашем коде

Приложениям, работающим в средах без разработки, часто требуется обновление базы данных. После использования команды Add-Migration для создания патчей базы данных необходимо запустить обновления в других средах, а затем и в тестовой среде.

Обычно возникают проблемы:

  • нет Visual Studio, установленной в производственных средах, и
  • никакие подключения не разрешены для подключения / среды клиентов в реальной жизни.

Обходной путь - это следующая последовательность кода, которая проверяет наличие обновлений и выполняет их по порядку. Пожалуйста, обеспечьте правильную обработку транзакций и исключений, чтобы гарантировать, что данные не будут потеряны в случае ошибок.

void UpdateDatabase(MyDbConfiguration configuration) {
   DbMigrator dbMigrator = new DbMigrator( configuration);
   if ( dbMigrator.GetPendingMigrations().Any() )
   {
      // there are pending migrations run the migration job
      dbMigrator.Update(); 
   }
}

где MyDbConfiguration - это ваша настройка миграции где-нибудь в ваших источниках:

public class MyDbConfiguration : DbMigrationsConfiguration<ApplicationDbContext>

Первоначальная схема первичной структуры Entity Framework Шаг за шагом

  1. Создайте консольное приложение.
  2. Установите пакет EntityFramework nuget, запустив Install-Package EntityFramework в «Консоль диспетчера пакетов»
  3. Добавьте строку подключения в файл app.config. Важно, чтобы в вашем соединении было включено имя providerName="System.Data.SqlClient" .
  4. Создайте публичный класс, как хотите, что-то вроде « Blog »,
  5. Создайте свой ContextClass, который наследуется от DbContext, что-то вроде « BlogContext »,
  6. Определите свойство в вашем контексте типа DbSet, что-то вроде этого:
public class Blog 
{
    public int Id { get; set; }

    public string Name { get; set; }
}
public class BlogContext: DbContext
{
    public BlogContext(): base("name=Your_Connection_Name")
    {
    }

    public virtual DbSet<Blog> Blogs{ get; set; }
}
  1. Важно передать имя соединения в конструкторе (здесь Your_Connection_Name)
  2. В консоли диспетчера пакетов запустите команду Enable-Migration , это создаст папку переноса в вашем проекте
  3. Запустите команду Add-Migration Your_Arbitrary_Migraiton_Name , это создаст класс миграции в папке миграции с двумя методами Up () и Down ()
  4. Запустите команду « Update-Database , чтобы создать базу данных с таблицей блога


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow