ASP.NET Core创建Web Api项目使用EF自动迁移多表数据库

2019-08-23 11:07:09

1. 项目创建

1.1 安装

  下载.NETCORE SDK 进行安装

  下载NETCORE RUNTIME进行安装.

  下载Runtime & Hosting Bundle进行安装

  下载地址:https://dotnet.microsoft.com/download/dotnet-core

  微软的安装在windows方面很简单,基本就是一键安装.

1.2 开发工具

            VisualStudio 2019

1.3建立项目工程

  点击文件创建项目,出现如下图示

  

  选择画红圈部分,接着出现如下图示

1.4 新建Models文件夹,创建数据库实体类

 

1.5 创建数据库上下文类

  创建继承DbContext的上下文类,将数据库实体添加到DbSet中,重写OnModelCreating方

 1 public class SchoolContext : DbContext
 2     {
 3         public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
 4         {
 5         }
 6 
 7         public DbSet<Course> Courses { get; set; }
 8         public DbSet<Enrollment> Enrollments { get; set; }
 9         public DbSet<Student> Students { get; set; }
10         public DbSet<Department> Departments { get; set; }
11         public DbSet<Instructor> Instructors { get; set; }
12         public DbSet<OfficeAssignment> OfficeAssignments { get; set; }
13         public DbSet<CourseAssignment> CourseAssignments { get; set; }
14 
15         protected override void OnModelCreating(ModelBuilder modelBuilder)
16         {
17             modelBuilder.Entity<Course>().ToTable("Course");
18             modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
19             modelBuilder.Entity<Student>().ToTable("Student");
20             modelBuilder.Entity<Department>().ToTable("Department");
21             modelBuilder.Entity<Instructor>().ToTable("Instructor");
22             modelBuilder.Entity<OfficeAssignment>().ToTable("OfficeAssignment");
23             modelBuilder.Entity<CourseAssignment>().ToTable("CourseAssignment");
24 
25             modelBuilder.Entity<CourseAssignment>()
26                 .HasKey(c => new { c.CourseID, c.InstructorID });
27         }
28     }

1.6使用测试数据设定数据库种子

  1 using System;
  2 using System.Linq;
  3 using Microsoft.EntityFrameworkCore;
  4 using Microsoft.Extensions.DependencyInjection;
  5 using ContosoUniversity.Models;
  6 
  7 namespace ContosoUniversity.Data
  8 {
  9     public static class DbInitializer
 10     {
 11         public static void Initialize(SchoolContext context)
 12         {
 13             //context.Database.EnsureCreated();
 14 
 15             // Look for any students.
 16             if (context.Students.Any())
 17             {
 18                 return;   // DB has been seeded
 19             }
 20 
 21             var students = new Student[]
 22             {
 23                 new Student { FirstMidName = "Carson",   LastName = "Alexander",
 24                     EnrollmentDate = DateTime.Parse("2010-09-01") },
 25                 new Student { FirstMidName = "Meredith", LastName = "Alonso",
 26                     EnrollmentDate = DateTime.Parse("2012-09-01") },
 27                 new Student { FirstMidName = "Arturo",   LastName = "Anand",
 28                     EnrollmentDate = DateTime.Parse("2013-09-01") },
 29                 new Student { FirstMidName = "Gytis",    LastName = "Barzdukas",
 30                     EnrollmentDate = DateTime.Parse("2012-09-01") },
 31                 new Student { FirstMidName = "Yan",      LastName = "Li",
 32                     EnrollmentDate = DateTime.Parse("2012-09-01") },
 33                 new Student { FirstMidName = "Peggy",    LastName = "Justice",
 34                     EnrollmentDate = DateTime.Parse("2011-09-01") },
 35                 new Student { FirstMidName = "Laura",    LastName = "Norman",
 36                     EnrollmentDate = DateTime.Parse("2013-09-01") },
 37                 new Student { FirstMidName = "Nino",     LastName = "Olivetto",
 38                     EnrollmentDate = DateTime.Parse("2005-09-01") }
 39             };
 40 
 41             foreach (Student s in students)
 42             {
 43                 context.Students.Add(s);
 44             }
 45             context.SaveChanges();
 46 
 47             var instructors = new Instructor[]
 48             {
 49                 new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie",
 50                     HireDate = DateTime.Parse("1995-03-11") },
 51                 new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",
 52                     HireDate = DateTime.Parse("2002-07-06") },
 53                 new Instructor { FirstMidName = "Roger",   LastName = "Harui",
 54                     HireDate = DateTime.Parse("1998-07-01") },
 55                 new Instructor { FirstMidName = "Candace", LastName = "Kapoor",
 56                     HireDate = DateTime.Parse("2001-01-15") },
 57                 new Instructor { FirstMidName = "Roger",   LastName = "Zheng",
 58                     HireDate = DateTime.Parse("2004-02-12") }
 59             };
 60 
 61             foreach (Instructor i in instructors)
 62             {
 63                 context.Instructors.Add(i);
 64             }
 65             context.SaveChanges();
 66 
 67             var departments = new Department[]
 68             {
 69                 new Department { Name = "English",     Budget = 350000,
 70                     StartDate = DateTime.Parse("2007-09-01"),
 71                     InstructorID  = instructors.Single( i => i.LastName == "Abercrombie").ID },
 72                 new Department { Name = "Mathematics", Budget = 100000,
 73                     StartDate = DateTime.Parse("2007-09-01"),
 74                     InstructorID  = instructors.Single( i => i.LastName == "Fakhouri").ID },
 75                 new Department { Name = "Engineering", Budget = 350000,
 76                     StartDate = DateTime.Parse("2007-09-01"),
 77                     InstructorID  = instructors.Single( i => i.LastName == "Harui").ID },
 78                 new Department { Name = "Economics",   Budget = 100000,
 79                     StartDate = DateTime.Parse("2007-09-01"),
 80                     InstructorID  = instructors.Single( i => i.LastName == "Kapoor").ID }
 81             };
 82 
 83             foreach (Department d in departments)
 84             {
 85                 context.Departments.Add(d);
 86             }
 87             context.SaveChanges();
 88 
 89             var courses = new Course[]
 90             {
 91                 new Course {CourseID = 1050, Title = "Chemistry",      Credits = 3,
 92                     DepartmentID = departments.Single( s => s.Name == "Engineering").DepartmentID
 93                 },
 94                 new Course {CourseID = 4022, Title = "Microeconomics", Credits = 3,
 95                     DepartmentID = departments.Single( s => s.Name == "Economics").DepartmentID
 96                 },
 97                 new Course {CourseID = 4041, Title = "Macroeconomics", Credits = 3,
 98                     DepartmentID = departments.Single( s => s.Name == "Economics").DepartmentID
 99                 },
100                 new Course {CourseID = 1045, Title = "Calculus",       Credits = 4,
101                     DepartmentID = departments.Single( s => s.Name == "Mathematics").DepartmentID
102                 },
103                 new Course {CourseID = 3141, Title = "Trigonometry",   Credits = 4,
104                     DepartmentID = departments.Single( s => s.Name == "Mathematics").DepartmentID
105                 },
106                 new Course {CourseID = 2021, Title = "Composition",    Credits = 3,
107                     DepartmentID = departments.Single( s => s.Name == "English").DepartmentID
108                 },
109                 new Course {CourseID = 2042, Title = "Literature",     Credits = 4,
110                     DepartmentID = departments.Single( s => s.Name == "English").DepartmentID
111                 },
112             };
113 
114             foreach (Course c in courses)
115             {
116                 context.Courses.Add(c);
117             }
118             context.SaveChanges();
119 
120             var officeAssignments = new OfficeAssignment[]
121             {
122                 new OfficeAssignment {
123                     InstructorID = instructors.Single( i => i.LastName == "Fakhouri").ID,
124                     Location = "Smith 17" },
125                 new OfficeAssignment {
126                     InstructorID = instructors.Single( i => i.LastName == "Harui").ID,
127                     Location = "Gowan 27" },
128                 new OfficeAssignment {
129                     InstructorID = instructors.Single( i => i.LastName == "Kapoor").ID,
130                     Location = "Thompson 304" },
131             };
132 
133             foreach (OfficeAssignment o in officeAssignments)
134             {
135                 context.OfficeAssignments.Add(o);
136             }
137             context.SaveChanges();
138 
139             var courseInstructors = new CourseAssignment[]
140             {
141                 new CourseAssignment {
142                     CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID,
143                     InstructorID = instructors.Single(i => i.LastName == "Kapoor").ID
144                     },
145                 new CourseAssignment {
146                     CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID,
147                     InstructorID = instructors.Single(i => i.LastName == "Harui").ID
148                     },
149                 new CourseAssignment {
150                     CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID,
151                     InstructorID = instructors.Single(i => i.LastName == "Zheng").ID
152                     },
153                 new CourseAssignment {
154                     CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID,
155                     InstructorID = instructors.Single(i => i.LastName == "Zheng").ID
156                     },
157                 new CourseAssignment {
158                     CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID,
159                     InstructorID = instructors.Single(i => i.LastName == "Fakhouri").ID
160                     },
161                 new CourseAssignment {
162                     CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID,
163                     InstructorID = instructors.Single(i => i.LastName == "Harui").ID
164                     },
165                 new CourseAssignment {
166                     CourseID = courses.Single(c => c.Title == "Composition" ).CourseID,
167                     InstructorID = instructors.Single(i => i.LastName == "Abercrombie").ID
168                     },
169                 new CourseAssignment {
170                     CourseID = courses.Single(c => c.Title == "Literature" ).CourseID,
171                     InstructorID = instructors.Single(i => i.LastName == "Abercrombie").ID
172                     },
173             };
174 
175             foreach (CourseAssignment ci in courseInstructors)
176             {
177                 context.CourseAssignments.Add(ci);
178             }
179             context.SaveChanges();
180 
181             var enrollments = new Enrollment[]
182             {
183                 new Enrollment {
184                     StudentID = students.Single(s => s.LastName == "Alexander").ID,
185                     CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID,
186                     Grade = Grade.A
187                 },
188                     new Enrollment {
189                     StudentID = students.Single(s => s.LastName == "Alexander").ID,
190                     CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID,
191                     Grade = Grade.C
192                     },
193                     new Enrollment {
194                     StudentID = students.Single(s => s.LastName == "Alexander").ID,
195                     CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID,
196                     Grade = Grade.B
197                     },
198                     new Enrollment {
199                         StudentID = students.Single(s => s.LastName == "Alonso").ID,
200                     CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID,
201                     Grade = Grade.B
202                     },
203                     new Enrollment {
204                         StudentID = students.Single(s => s.LastName == "Alonso").ID,
205                     CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID,
206                     Grade = Grade.B
207                     },
208                     new Enrollment {
209                     StudentID = students.Single(s => s.LastName == "Alonso").ID,
210                     CourseID = courses.Single(c => c.Title == "Composition" ).CourseID,
211                     Grade = Grade.B
212                     },
213                     new Enrollment {
214                     StudentID = students.Single(s => s.LastName == "Anand").ID,
215                     CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID
216                     },
217                     new Enrollment {
218                     StudentID = students.Single(s => s.LastName == "Anand").ID,
219                     CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID,
220                     Grade = Grade.B
221                     },
222                 new Enrollment {
223                     StudentID = students.Single(s => s.LastName == "Barzdukas").ID,
224                     CourseID = courses.Single(c => c.Title == "Chemistry").CourseID,
225                     Grade = Grade.B
226                     },
227                     new Enrollment {
228                     StudentID = students.Single(s => s.LastName == "Li").ID,
229                     CourseID = courses.Single(c => c.Title == "Composition").CourseID,
230                     Grade = Grade.B
231                     },
232                     new Enrollment {
233                     StudentID = students.Single(s => s.LastName == "Justice").ID,
234                     CourseID = courses.Single(c => c.Title == "Literature").CourseID,
235                     Grade = Grade.B
236                     }
237             };
238 
239             foreach (Enrollment e in enrollments)
240             {
241                 var enrollmentInDataBase = context.Enrollments.Where(
242                     s =>
243                             s.Student.ID == e.StudentID &&
244                             s.Course.CourseID == e.CourseID).SingleOrDefault();
245                 if (enrollmentInDataBase == null)
246                 {
247                     context.Enrollments.Add(e);
248                 }
249             }
250             context.SaveChanges();
251         }
252     }
253 }

1.7在appsetting.json文件中配置本地数据库连接

1 "ConnectionStrings": {
2     "SchoolContext": "Server=.;Database=ApiDb;user id=sa;password=123456;"
3   }

1.8在Startup.cs文件中配置使用sql server

 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3       services.AddDbContext<SchoolContext>(opt =>
 4         opt.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
 5       services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
 6       services.AddSwaggerGen(c =>
 7       {
 8         c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
 9       });
10 }

 1.9在Program.cs文件中调用测试数据

 1 public class Program
 2 {
 3     public static void Main(string[] args)
 4     {
 5         var host = CreateWebHostBuilder(args).Build();
 6 
 7         using (var scope = host.Services.CreateScope())
 8         {
 9             var services = scope.ServiceProvider;
10             try
11             {
12                 var context = services.GetRequiredService<SchoolContext>();
13                 DbInitializer.Initialize(context);
14             }
15             catch (Exception ex)
16             {
17                 var logger = services.GetRequiredService<ILogger<Program>>();
18                 logger.LogError(ex, "An error occurred while seeding the database.");
19             }
20         }
21 
22         host.Run();
23 }

2. EF数据库迁移

2.1首先在本地数据库,创建一个空的数据库

2.2执行数据库迁移

  保存项目更改,生成项目。然后打开CMD命令窗口,切换到工程目录下,执行以下命令

dotnet ef migrations add ComplexDataModel

2.3更新数据库

  更改数据库后或删除数据库后,在命令窗口运行以下命令

dotnet ef database update

2.4查看数据库

  打开SQL Server Management,查看数据库表生成情况

2.5运行项目,生成测试数据

  测试数据已自动生成

原文地址:https://www.cnblogs.com/zmsoftbj/p/11398858.html