新建一个ZP的项目
第一步:创建实体类,完善实体类主外键关系.
第二部:新建前台页面文件夹Page/Ent,搭建机架,系统自动创建了以下内容:
1.机架带有的页面列表和增删改查.
2.创建了Data/ZPContext.cs数据库
3.在Startup.cs注入数据连接.
services.AddDbContext<ZPContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ZPContext")));
4.在appsettings.json添加了数据连接字符串.(需要修改下数据库名称等信息)修改后为
"ConnectionStrings": { "ZPContext": "Server=.;Database=ZP5;Trusted_Connection=True;MultipleActiveResultSets=true" }
这时运行会报错.因为没有自动创建数据库.
5.修改Program.cs,若没有数据库自动创建.修改Main方法.
var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { var context = services.GetRequiredService<ZPContext>(); context.Database.EnsureCreated(); } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred creating the DB."); } } host.Run();
6.运行项目,自动创建数据库ZP5
添加数据进行测试.发现多表联合查询不好用,取不出数据.
7.使用EF CORE 根据数据库重新反向生成实体和数据连接.(因为已经存在DATA文件夹实体数据连接.会有错误,把DATA文件夹删除即可.)此时运行,多表联合查询同样不好用.
8.删除Page/Ent文件夹,重新建立Ent文件夹,重新搭建机架项目.若数据对应关系正确,应该,多表联合查询,已经可以了.因为自动添加了多表联合查询语句.
Company = await _context.Company .Include(c => c.AreaInfo).ToListAsync();
第一节到此结束.
完善:
1.防止过多发布被黑客利用,对创建页面进行处理.(只更新给出的字段.)
系统自动给出的代码为
_context.Student.Add(emptyStudent); await _context.SaveChangesAsync(); return RedirectToPage("./Index");
修改位以下相同代码用***代替了
var emptyStudent = new Student(); if (await TryUpdateModelAsync<Student>( emptyStudent, "student", // Prefix for form value. s => s.FirstMidName, s => s.LastName, s => s.EnrollmentDate)) { **** } return null;
2.FirstOrDefaultAsync 更改为
Student = await _context.Student.FirstOrDefaultAsync(m => m.ID == id);
Student = await _context.Student.FindAsync(m => m.ID == id);
提示:无法将Lambda表达式转换为类型Object,原因是它不是委托类型.
Student = await _context.Student.FindAsync(id);