【发布时间】:2022-01-10 12:44:15
【问题描述】:
我刚开始使用 SQL,并试图让我的第一个示例正常工作。我有两个具有一对多关系的表:
public class Customer
{
public Guid Id { get; set; }
public string CompanyName { get; set; }
public string Address { get; set; }
[JsonIgnore]
public virtual ICollection<Project> Projects { get; set; }
}
public class Project
{
public Guid Id { get; set; }
public string Name { get; set; }
public string ProjectType { get; set; }
public Guid CustomerId { get; set; }
public Customer Customer { get; set; }
}
然后我通过 API ProjectsController 执行以下命令:
[HttpGet]
public async Task<IActionResult> Get()
{
System.Collections.Generic.List<Project> projects =
await _context.Projects.Include(d => d.Customer).ToListAsync();
return Ok(projects);
}
我得到了我的
private IEnumerable<Project> ProjectsList { get; set; } = new List<Project>();
在剃须刀页面上,与
this.ProjectsList = await this.HttpClient.GetFromJsonAsync<IEnumerable<Project>>("api/Projects");
我已经用调试器检查了ProjectsList 的数据结构,它看起来很好。
但是:Razor 页表(两列“项目名称”和“客户名称”):
<Table DataSource="ProjectsList" TItem="Project">
<Column TData="string"
Title="Name"
@bind-Field="context.Name"
SorterCompare="@((a,b)=> string.Compare(a,b))"
SortDirections="new[] { SortDirection.Descending }"
Filterable />
<Column TData="string"
@bind-Field="context.Customer.CompanyName"
SorterCompare="@((a,b)=> string.Compare(a,b))"
SortDirections="new[] { SortDirection.Descending }"
Filterable />
</Table>
我得到一个未设置为对象实例的对象异常。我猜这是因为context.Customer.CompanyName 没有初始化Customer?
首先我有一个问题,我应该重做我的Project 模型并在那里添加额外的字符串类型列CompanyName,还是有其他方法可以让数据显示在剃须刀页面上?
如果...我应该在Project.cs 中添加额外的列,如何在其中使用 linq 查询数据?
【问题讨论】:
-
将来您可能希望使用
var通过省略变量类型来缩短您的代码,并使用using来缩短命名空间。 -
您可以尝试将其改为
context.Customer?.CompanyName吗?你能检查一下 null 在哪里吗? -
@HiFo - 一个问题。您是否考虑过将应用程序逻辑(客户和项目之间的关系)构建到数据层中?我知道 EF 允许,几乎鼓励这样做,但是你建立的关系越复杂,就越难(咒骂而不是打字)找出问题所在。另一种方法是将这些关系构建到您的核心应用程序层中。复杂性没有改变,但都是 C# 代码。你可以调试它,并模拟它进行测试!
-
@MrCakaShaunCurtis 我目前只是在练习,但是是的,我需要更详细地研究我的应用程序的架构。我现在已经看到很多架构示例的示例,因此我很难选择一个,因为我还不了解每个示例的好处。目前我只有客户端、服务器和共享。
-
@HiFo。有许多竞争的替代品!我已经根据此处所谓的“干净”设计原则 - github.com/ShaunCurtis/Blazr.Demo 构建了 Blazor 解决方案和模板。它至少会给你一个以 Blazor 为中心的起点。
标签: c# sql asp.net linq blazor