Ответ 1
Вам нужно добавить таблицу в свою реализацию класса DbContext
, например.
public class MyDatabaseEntities : DbContext {
public virtual DbSet<MyTable> MyTable { get; set; }
}
У меня есть локальная база данных, в которой сейчас находится вторая версия, и теперь нужно перейти к третьей версии.
Код предыдущих миграций был сгенерирован другим программистом, поэтому я предполагаю, что я делаю что-то неправильно здесь.
В моей модели есть около 30 классов, а внутри папки модели есть папка сопоставления и содержит сопоставления для этих 30 классов.
Итак, теперь я добавил 1 новый класс таким же образом, как и предыдущие классы, а затем запустил команду add-migration в консоли диспетчера пакетов.
К сожалению, я получаю пустой метод Up() и Down().
Когда я смотрю в базе данных, существует __migrationHistory, доступная с предыдущими 2 переходами. Если я сейчас запустил приложение, добавлена и третья миграция, но, очевидно, новая таблица не создается, потому что она не находится в методе Up().
Что я могу делать неправильно?
Я думаю, что что-то идет не так, когда выкладываете предыдущие миграции... Это похоже на то, что я не могу найти новые классы Code-First, которые я добавил.
Это моя команда:
add-migration "1.2" -verbose -ProjectName "MyEFproject"
Я предполагаю, что строительные леса не знают, где искать новый класс... или это согласуется с тем, что все классы моделей просто ожидаются в проекте?
Результат добавления-миграции:
namespace MyProject.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class _1002 : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}
Пример нового класса модели:
using System;
using System.Collections.Generic;
namespace MyProject.Models
{
public partial class MyTable
{
public string SomeId { get; set; }
public string SomeText { get; set; }
}
}
Пример нового класса сопоставления
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
namespace MyProject.Models.Mapping
{
public class MyTableMap : EntityTypeConfiguration<MyTable>
{
public MyTableMap()
{
// Primary Key
this.HasKey(t => t.SomeId);
// Properties
this.Property(t => t.SomeText)
.IsRequired()
.HasMaxLength(30);
// Table & Column Mappings
this.ToTable("MyTable", "database");
this.Property(t => t.SomeId).HasColumnName("SomeId");
this.Property(t => t.SomeText).HasColumnName("SomeText");
}
}
}
Спасибо,
Вам нужно добавить таблицу в свою реализацию класса DbContext
, например.
public class MyDatabaseEntities : DbContext {
public virtual DbSet<MyTable> MyTable { get; set; }
}
Мне удалось исправить эту проблему, удалив запись последней миграции из таблицы _MigrationHistory. Эта запись была неправильно создана до того, как я добавил DbSet для нового объекта модели в класс DbContext. После этого удаления была создана новая миграция с правильными методами Up() и Down().
При откате существующего базового контекста данных EF до пустого значения мои миграции не будут генерироваться, пока я не удалю ApplicationDbContextModelSnapshot
, сопровождающий миграции.
Этот класс создается автоматически и должен соответствовать текущему уровню миграции.
set;} после имен моих переменных
В моем случае проект datacontext представляет собой проект класса lib. Он отличается от проекта запуска, который представляет собой проект asp.net mvc 5. Теперь по ошибке строка подключения в проекте запуска указывает на другую другую базу данных.
Таким образом, убедитесь, что проект datacontext и проект запуска указывают на одну и ту же базу данных. Также используйте полную команду, как указано в следующем вопросе. Вы также можете включить -Force.
add-migration "InitialMigration" -verbose -ProjectName "MyEFproject" -Force
В моем случае я выполнял миграцию, где я добавлял поля в существующую таблицу и получал пустые методы Up
и Down
,
У меня было что-то вроде этого:
public bool ExistingField { get; set; }
bool NewField { get;set; }
Вы можете заметить разницу...?
Если вы допустите эту ошибку, перезапустите миграцию с тем же именем (вам, вероятно, потребуется добавить параметр -Force
чтобы -Force
его полностью).
PS. Всегда проверяйте, что ваш проект полностью собран, прежде чем пытаться выполнить какую-либо команду EF. Если ваш проект еще не построен, вы напрашиваетесь на неприятности.
Я получал пустые миграции, добавленные, когда я ошибочно связал две таблицы, используя отношения 1-много, а не многие-многие (т.е. я забыл одно из свойств навигации). У меня был файл для посева, который ожидал много-много отношений и впоследствии не выполнялся во время миграции, что привело к сбою миграции. К сожалению, не было вывода, из-за чего было очевидно, что это была проблема, и только с помощью Entity Framework Power Tools (v4, но установленного в VS2015) я визуально увидел неправильную связь и понял, что это, вероятно, причина.
Мне пришлось обновить базу данных с последней миграцией перед пустой, добавив этот параметр -TargetMigration:"{your-migration-name}"
.
Вероятно, это скажет вам, что будет потеря данных от следующей ошибки, которую мы попробовали. Если вы можете себе это позволить, добавьте к нему -Force
.
Затем я попытался добавить свою новую Add-Migration
и она не была пустой.
Последнее, что вам может понадобиться сделать, если приведенное выше исключение - это перейти в SQL Server Management Studio, удалить последнюю Automatic migration
и попытаться добавить ее снова.
Если ваш проект небольшой, то есть у вас пока не слишком много миграций, вы можете удалить все из своей папки Migration. После этого добавьте миграции снова.
У меня возникла именно эта проблема после того, как я хотел добавить дополнительный столбец в мою базу данных. Поскольку мои данные не будут заполняться, пока таблицы не будут пустыми, я удалил все таблицы и миграции, чтобы воссоздать таблицы. Когда я пытался мигрировать, у миграции были пустые методы вверх и вниз.
Я решил это, удалив файл снимка, так как это создавало проблему. Поэтому я удалил все миграции и файл снимка, снова добавил миграцию и запустил обновление базы данных. Таблицы и миграции были успешно обновлены с моим новым столбцом.
Однако лучший способ сделать это - запустить метод down и отбросить таблицы, если вы работаете с тестовыми данными. Очевидно, что в реальном мире плохо отбрасывать таблицы.
Для меня проблема была в том, что свойство Id, которое должно соответствовать идентификатору таблицы, называлось FeedbackId. Я изменил на "Id", а затем "вверх/вниз" больше не было пустым. Не знаю, может ли это как-то помочь