#c# #.net #asp.net-mvc #asp.net-mvc-4 #ef-code-first
#c# #.net #asp.net-mvc #asp.net-mvc-4 #ef-code-first
Вопрос:
Я предполагаю, что мне чего-то не хватает, но когда я создаю миграции в проекте, они продолжают показывать пустые методы Up и Down. Даже в совершенно новом проекте. Вот мои шаги.
Запустите Visual Studio 2019. Создайте новый ASP.NET Проект веб-приложения (.net framework) на языке C # (4.7.2). Выберите MVC и в разделе аутентификация выберите отдельные учетные записи пользователей. Нажмите Создать, чтобы создать проект.
Затем я включаю миграции.
Enable-Migrations
Затем я добавляю свою первую миграцию.
Add-Migration First
Первая миграция успешно добавлена со всей идентификационной информацией для отдельных учетных записей пользователей. Все хорошо.
Я обновляю базу данных, чтобы применить миграцию. Все по-прежнему хорошо.
Update-Database
Теперь я добавляю новый класс в папку Models под названием SchoolContext.
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
namespace WebApplication6.Models
{
public class SchoolContext : DbContext
{
public DbSet<Student> Students { get; set; }
public SchoolContext() : base("DefaultConnection") { }
}
public class Student
{
[Key]
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
}
}
Теперь я возвращаюсь к консоли диспетчера пакетов, чтобы создать другую миграцию. Я пытаюсь создать новую миграцию.
Add-Migration Second
Но на этот раз класс пуст. он не создает мою новую таблицу.
namespace WebApplication6.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class Second : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}
Чего мне не хватает? Почему он не хочет генерировать миграцию с моей новой таблицей?
Как и было запрошено, вот как выглядит мой ApplicationDbContext в моем классе IdentityModel.cs, сгенерированном Visual Studio.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
Комментарии:
1. c-sharpcorner.com/article /… посмотрите на этот простой учебник
2. Этот пример работает, но, похоже, я не могу заставить его работать, когда identitymodel был автоматически сгенерирован.
Ответ №1:
Если ваша первая миграция создала таблицы пользователей, то я предполагаю, что она использовалась IdentityDbContext
. Затем вам нужно наследовать ваш SchoolContext
не от DbContext
, а от IdentityDbContext
.
ОБНОВЛЕНИЕ: основываясь на последнем обновлении вопроса, ясно, что приложение уже имеет один контекст базы данных, который ApplicationDbContext
. Поэтому обычно достаточно хранить все DbSet<>
в одном контексте базы данных. Нет необходимости создавать новый контекст.
Комментарии:
1. Я пытался наследовать
IdentityDbContext<ApplicationUser>
, но это не сработало. Но я обнаружил, что добавление этогоpublic DbSet<Student> Students { get; set; }
непосредственно в метод ApplicationDbContext в IdentityModel.cs сработало. затем миграция сгенерирована правильно. Не уверен, понимаю ли я почему.2. Не могли бы вы опубликовать свой класс ‘ApplicationDbContext’ здесь?
3. Я добавлю его в свой исходный пост
Ответ №2:
Вам не хватает свойства dbset.
Поместите его в качестве следующего примера, чтобы миграции могли обнаружить новый класс / таблицу. После добавления свойства dbset добавьте новую миграцию, чтобы увидеть запись нового класса.
Если у вас уже есть ожидающая миграция, выполните принудительную запись, чтобы код увидел новые изменения и обновил миграцию
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base("DefaultConnection") {
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
public virtual DbSet<Student> Students { get; set; }
}
Обратите внимание, что есть 2 dbcontexts, которые не имеют понятного использования, используйте только ApplicationDbContext и удалите другой.