提问人:MelB 提问时间:9/15/2023 最后编辑:Md Farid Uddin KironMelB 更新时间:9/15/2023 访问量:44
联接两个表在 Razor 页面上不起作用
Join of Two Tables Not Working on Razor Page
问:
我尝试在 Razor 页面应用上创建一个报表页,但无法使其正常工作。我有一个类似的工作应用程序,看不到我在哪里做任何不同的事情,但一定遗漏了一些明显的东西。
以下是有问题的观点:
@page
@model RabiesShotTracker.Pages.Reports.UnpaidBills.IndexModel
<div id="UnpaidBillsIndex" class="container p-3">
<div class="row pt-4">
<div class="col-6">
<h2 class="text-primary">Unpaid Bills</h2>
</div>
</div>
<br /><br />
<form asp-page="./Index" method="post">
<div id="UnpaidBillsReport" class="row pt-4">
<div class="col-25">
<h2 class="text-primary" align="center">Public Health</h2>
<h3 class="text-primary" align="center">Rabies Shots Unpaid Bills</h3>
</div>
<table id="DataTable" class="table table-bordered" style="width:75%" align="center">
<thead>
<tr>
<th style ="text-align: center">
Incident No
</th>
<th style="text-align: center">
Patient Name
</th>
<th style="text-align: center">
Date of Birth
</th>
<th style="text-align: center">
Exposure Date
</th>
<th style="text-align: center">
Date Shot Scheduled
</th>
<th style="text-align: center">
Date Shot Received
</th>
</tr>
</thead>
<tbody>
@for (var i = 0; i < Model.Client.Shots.Count; i++)
{
<tr>
<td style="width: 15%">
<div class="mb-3">
<input asp-for="Client.Shots[i].IncidentNo" type="text" readonly class="form-control-plaintext" />
</div>
</td>
<td style="width: 25%">
<div class="mb-3">
<input asp-for="Client.FullName" type="text" readonly class="form-control-plaintext" />
</div>
</td>
<td style="width: 15%">
<div class="mb-3">
<input asp-for="Client.Birthdate" type="text" readonly class="form-control-plaintext" />
</div>
</td>
<td style="width: 15%">
<div class="mb-3">
<input asp-for="Client.ExposureDate" type="text" readonly class="form-control-plaintext" />
</div>
</td>
<td style="width: 15%">
<div class="mb-3">
<input asp-for="Client.Shots[i].ShotSchedDate" type="text" readonly class="form-control-plaintext" />
</div>
</td>
<td style="width: 15%">
<div class="mb-3">
<input asp-for="Client.Shots[i].ShotRecdDate" type="text" readonly class="form-control-plaintext" />
</div>
</td>
</tr>
}
</tbody>
</table>
</form>
</div>
这是它背后的.cs:
using RabiesShotTracker.Data;
using RabiesShotTracker.Model;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
namespace RabiesShotTracker.Pages.Reports.UnpaidBills
{
public class IndexModel : PageModel
{
private readonly ApplicationDbContext _db;
public Client Client { get; set; }
public Shot Shot { get; set; }
public IndexModel(ApplicationDbContext db)
{
_db = db;
}
public void OnGet(int Id)
{
Client = _db.Client
.Include(client => client.Shots).FirstOrDefault(client => client.ClientId == Id);
}
}
}
以下是客户端模型的相关部分:
using System.ComponentModel.DataAnnotations;
namespace RabiesShotTracker.Model
{
public class Client
{
[Key]
[Display(Name = "Client Id")]
public int ClientId { get; set; }
public List<Shot>? Shots { get; set; }
[Required]
[Display(Name = "Client No (###)")]
public string? ClientNo { get; set; }
[Required]
[Display(Name = "Incident No")]
public string? IncidentNo { get; set; }
以下是 Shot 模型的相关部分:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RabiesShotTracker.Model
{
public class Shot
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ShotId { get; set; }
[Required]
public int ClientId { get; set; }
public Client? Client { get; set; }
[Required]
[Display(Name = "Incident No")]
public string? IncidentNo { get; set; }
[Required]
[Display(Name = "Client No")]
public string? ClientNo { get; set; }
当我运行应用程序时,我收到一个 NullReferenceException:对象引用未设置为对象的实例。在生产线上:
@for (var i = 0; i < Model.Client.Shots.Count; i++)
两个表(Client 和 Shot)都有值,所以我不确定我做错了什么?我是否错过了一些明显的东西?
提前感谢您提供的任何帮助。我盯着这个看太久了。
答:
两个表(Client 和 Shot)都有值,所以我不确定 我做错了什么?我是否错过了一些明显的东西?
首先,您的 Shot 表设计或模型定义违反了 3NF 数据库规范化,因为通过客户端 ID,您可以访问镜头表中的所有实体,因此,IncidentNo 和 ClientNo 只是 Client 表的重复。
但是,表关系应该不存在通过使用 ClientId 联接来获取数据的问题。我已经与您的代码片段一起进行了调查,并尝试插入一些手动数据,它似乎按预期工作。
什么,我假设请检查您的搜索键,即您在方法中传递的 ID。OnGet(int Id)
除此之外,您还应该检查您的 ApplicationDbContext 定义,以及它是否相应地创建了您的数据库表架构。
最重要的是,请检查您的 ClientId 是否在 Shot 表上有正确的处理。
我已经尝试了与您相同的方式,并且我已经执行了迁移命令,并且它已创建数据库表,如下所示:
迁移后的数据库表:
Appsetting.json:
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\ProjectModels;Database=RazorPageTableJoinDb;Trusted_Connection=True;MultipleActiveResultSets=true"
},
Db 上下文类:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
public DbSet<Client> Clients { get; set; }
public DbSet<Shot> Shots { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}
Program.cs 类:
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(x => x.UseSqlServer(connectionString));
// Add services to the container.
builder.Services.AddRazorPages();
剃刀页面 .cs:
public class ForeignKeyTableJoinModel : PageModel
{
private readonly ApplicationDbContext _db;
public Client Client { get; set; }
public Shot Shot { get; set; }
public ForeignKeyTableJoinModel(ApplicationDbContext db)
{
_db = db;
}
public void OnGet()
{
var Id = 1;
Client = _db.Clients
.Include(client => client.Shots).FirstOrDefault(client => client.ClientId == Id);
}
}
输出:
注意:确保给定的 ClientId 具有正确的数据,并且在数据库表中它们具有正确的关系。此外,还要将查询发送到 appsetting.json 连接字符串中的正确数据库。
评论
OnGet(int Id)
OnGet(int Id)
"Join of Two Tables Not Working on Razor Page"
评论
ApplicationDbContext