Попытка заполнить базу данных с помощью EF Core — не работает при запуске (ctrl F5)

#c# #asp.net #asp.net-mvc #asp.net-core

#c# #asp.net #asp.net-mvc #asp.net-core

Вопрос:

Я разрабатываю следующее приложение с использованием Entity Framework и пытаюсь создать и заполнить базу данных под названием Students. Однако, когда я запускаю приложение, ничего не происходит, и я вижу существующие базы данных, но не новую, которую я пытаюсь заполнить.

Это мой файл сеялки:

 
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using ContosoUniversity.Models;
    
    namespace ContosoUniversity.Data
    {
        public static class DbInitializer
        {
            public static void Initialize(SchoolContext context)
            {
                // Look for any students
                if (context.Students.Any())
                {
                    return; // DB has already been seeded
                }
    
                var students = new Student[]
                {
                new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
                new Student{FirstMidName="Meredith", LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
                new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
                };
                foreach (Student s in students)
                {
                    context.Students.Add(s);
                }
                context.SaveChanges();
    
                var courses = new Course[]
                {
                new Course{CourseID=1050,Title="Chemistry",Credits=3},
                new Course{CourseID=4022,Title="Microeconomics",Credits=3},
                new Course{CourseID=4041,Title="Macroeconomics",Credits=3},
                new Course{CourseID=1045,Title="Calculus",Credits=4},
                new Course{CourseID=3141,Title="Trigonometry",Credits=4},
                new Course{CourseID=2021,Title="Composition",Credits=3},
                new Course{CourseID=2042,Title="Literature",Credits=4}
                };
                foreach (Course c in courses)
                {
                    context.Courses.Add(c);
                }
                context.SaveChanges();
    
                var enrollments = new Enrollment[]
                {
                new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
                new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
                new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
                new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
                new Enrollment{StudentID=3,CourseID=1050},
                new Enrollment{StudentID=4,CourseID=1050},
                new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
                new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
                new Enrollment{StudentID=6,CourseID=1045},
                new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
                };
                foreach (Enrollment e in enrollments)
                {
                    context.Enrollments.Add(e);
                }
                context.SaveChanges();
            }
        }
    }

// checks to see if there are any students in the database,
// if not, assumes database is new and needs to be seeded
// with test data. Loads test data into arrays rather than
// List<T> collections to optimize performance.

  

Мой файл Program.cs:

     using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using ContosoUniversity.Data;
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    
    namespace ContosoUniversity
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                var host = BuildWebHost(args);
    
                using (var scope = host.Services.CreateScope())
                {
                    var services = scope.ServiceProvider;
                    try
                    {
                        var context = services.GetRequiredService<SchoolContext>();
                        DbInitializer.Initialize(context);
                    }
                    catch (Exception ex)
                    {
                        var logger = services.GetRequiredService<ILogger<Program>>();
                        logger.LogError(ex, "An error occurred while seeding the database.");
                    }
                }
    
                host.Run();
            }
    
            public static IWebHost BuildWebHost(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .Build();
        }
    
    }

  

appsettings.json

 
    {
      "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\MSSQLLocalDB;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
    }
  

Если у кого-нибудь есть идеи о том, как это исправить, это было бы здорово.

Спасибо,

Роберт

Лондон, Англия

Комментарии:

1. Когда вы хотите добавить коллекцию, для нее вызывается метод AddRange , и вы вызываете context.SaveChanges(); его только один раз, когда закончите добавлять данные.

2. Может быть, из-за уже созданной базы данных и таблиц?

3. В какой строке возникает ошибка? Не могли бы вы поделиться своим описанием модели? И убедитесь, что ваш CourseID столбец не является идентификатором.