项目笔记一:新建Razor实现多表联合查询

新建一个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);

原文地址:https://www.cnblogs.com/dxh0535/p/9937411.html