将多个对象添加到另一个对象
Posted
技术标签:
【中文标题】将多个对象添加到另一个对象【英文标题】:Adding more than one object to another 【发布时间】:2021-07-14 13:41:01 【问题描述】:我一直在开发我在本教程 (https://docs.microsoft.com/pl-pl/aspnet/core/data/ef-rp/complex-data-model?view=aspnetcore-5.0&tabs=visual-studio) 中制作的应用程序版本。我对两个对象之间的联系有疑问。我的想法是向 Paczka 添加多个材质。我已经设法将它们连接在一起,但我只能添加一种材质。所以我的问题是我应该怎么做才能连接多个?
物体材质
public class Material
[Key]
public int PaczkaID get; set;
public string Name get; set;
public string PN get; set;
public string Cert get; set;
public string Qty get; set;
public Paczka Paczka get; set;
和对象 Paczka
public class Paczka
public int PaczkaID get; set;
public string CRS get; set;
public string WO get; set;
public DateTime StartDate get; set;
public DateTime EndDate get; set;
public Material Material get; set;
这是我如何将材质添加到 Paczka
public class MaterialModel : PageModel
private readonly Pasto.Data.PastoContext _context;
public MaterialModel(Pasto.Data.PastoContext context)
_context = context;
[BindProperty]
public Paczka Paczka get; set;
public async Task<IActionResult> OnGetAsync(int? id)
if (id == null)
return NotFound();
Paczka = await _context.Paczkas
.Include(i => i.Material)
.AsNoTracking()
.FirstOrDefaultAsync(m => m.PaczkaID == id);
if (Paczka == null)
return NotFound();
return Page();
public async Task<IActionResult> OnPostAsync(int? id)
if (id == null)
return NotFound();
var paczkaToUpdate = await _context.Paczkas
.Include(i => i.Material)
.FirstOrDefaultAsync(s => s.PaczkaID == id);
if (paczkaToUpdate == null)
return NotFound();
if (await TryUpdateModelAsync<Paczka>(
paczkaToUpdate,
"Paczka",
i => i.Material))
if (String.IsNullOrWhiteSpace(
paczkaToUpdate.Material?.Name))
paczkaToUpdate.Material = null;
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
return Page();
和 html
a<form method="post">
<table class="table">
<thead>
<tr>
<th>
<strong>Name</strong>
</th>
<th>
<strong>P/N</strong>
</th>
<th>
<strong>Certificate</strong>
</th>
<th>
<strong>Quantity</strong>
</th>
</tr>
</thead>
<div class="form-group">
<tbody>
<tr>
<td>
<input asp-for="Paczka.Material.Name" class="form-control" />
</td>
<td>
<input asp-for="Paczka.Material.PN" class="form-control" />
</td>
<td>
<input asp-for="Paczka.Material.Cert" class="form-control" />
</td>
<td>
<input asp-for="Paczka.Material.Qty" class="form-control" />
</td>
</tr>
</tbody>
</div>
</table>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
<a asp-page="./Index" class="btn btn-danger">Back to List</a>
</div>
【问题讨论】:
你是说你想让Pazka有很多材料吗?如果是这样,一种材料可以属于不同的 Pazkas 吗? 是的,我希望 Paczka 拥有许多材料。该材料应该只属于一个 Paczka,因为我想在创建 Paczka 的同时创建它们。 【参考方案1】:我希望 Paczka 拥有许多材质。该材料应仅属于 给一个 Paczka,因为我想在创建 Paczka 的同时创建它们
根据您的描述,Paczka 和 Materials 应该是一对多的关系。在Paczka类中,使用List
或ICollection
定义导航属性(Material),代码如下:
public class Paczka
public int PaczkaID get; set;
public string CRS get; set;
public string WO get; set;
public DateTime StartDate get; set;
public DateTime EndDate get; set;
public List<Material> Material get; set;
public class Material
[Key]
public int PaczkaID get; set;
public string Name get; set;
public string PN get; set;
public string Cert get; set;
public string Qty get; set;
//the foreign key
public int PaczkaForeignKey get; set;
[ForeignKey("PaczkaForeignKey")]
public Paczka Paczka get; set;
然后,在 View 页面中,你可以使用@for
语句循环遍历 Material 并显示相关数据,代码如下:
@page
@model RazorPageSample.Pages.MaterialModel
@
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Paczka.PaczkaID" />
<div class="form-group">
<label asp-for="Paczka.CRS" class="control-label"></label>
<input asp-for="Paczka.CRS" class="form-control" />
<span asp-validation-for="Paczka.CRS" class="text-danger"></span>
</div>
@for (var i = 0; i < Model.Paczka.Material.Count; i++)
<div class="form-group">
<label asp-for="Paczka.Material[i].PaczkaID" class="control-label"></label>
<input asp-for="Paczka.Material[i].PaczkaID" class="form-control" />
<span asp-validation-for="Paczka.Material[i].PaczkaID" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Paczka.Material[i].Name" class="control-label"></label>
<input asp-for="Paczka.Material[i].Name" class="form-control" />
<span asp-validation-for="Paczka.Material[i].Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Paczka.Material[i].Cert" class="control-label"></label>
<input asp-for="Paczka.Material[i].Cert" class="form-control" />
<span asp-validation-for="Paczka.Material[i].Cert" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
然后,在 Post 方法中,获取更新值并将数据插入或更新到数据库,截图如下:
有关关系和更新相关实体的更多详细信息,请参阅以下文章:
Relationships
Configuring One To Many Relationships in Entity Framework Core
Update related data - ASP.NET MVC with EF Core
【讨论】:
以上是关于将多个对象添加到另一个对象的主要内容,如果未能解决你的问题,请参考以下文章
关于ivx中将对象数组的某一列添加到另一对象数组中的经验总结