ASP.NET Код MVC -Первое построение пустых миграций

#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 и удалите другой.