将多个对象添加到另一个对象

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类中,使用ListICollection定义导航属性(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

【讨论】:

以上是关于将多个对象添加到另一个对象的主要内容,如果未能解决你的问题,请参考以下文章

C ++将具有重载构造函数的对象添加到另一个对象

关于ivx中将对象数组的某一列添加到另一对象数组中的经验总结

如何将 JSON 对象作为新级别添加到另一个 JSON 对象?

将数据从一个 json 对象动态添加到另一个

将对象从一个类添加到另一个类

如何将对象添加到另一个类中的 vector<object> ?