Asp.net core 将多个对象添加到另一个对象

Asp.net core 将多个对象添加到另一个对象,asp.net-core,asp.net-web-api,asp.net-core-razor-pages,Asp.net Core,Asp.net Web Api,Asp.net Core Razor Pages,我一直在编写本教程中制作的应用程序的版本()。我有个问题,关于两个物体之间的联系。我的想法是在Paczka中添加多个材质。我已设法将它们连接在一起,但我只能添加一种材质。所以我的问题是我应该怎么做才能连接多个 实物材料 public class Material { [Key] public int PaczkaID { get; set; } public string Name { get; set; } public string PN { get; set

我一直在编写本教程中制作的应用程序的版本()。我有个问题,关于两个物体之间的联系。我的想法是在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();
    }
            
}
公共类材质模型:页面模型
{
私有只读Pasto.Data.PastoContext\u上下文;
公共材料模型(Pasto.Data.PastoContext上下文)
{
_上下文=上下文;
}
[BindProperty]
公共Paczka Paczka{get;set;}
公共异步任务OnGetAsync(int?id)
{
if(id==null)
{
返回NotFound();
}
Paczka=wait_context.Paczkas
.包括(i=>i.材料)
.AsNoTracking()
.FirstOrDefaultAsync(m=>m.PaczkaID==id);
if(Paczka==null)
{
返回NotFound();
}
返回页();
}
公共异步任务OnPostAsync(int?id)
{
if(id==null)
{
返回NotFound();
}
var paczkaToUpdate=await_context.Paczkas
.包括(i=>i.材料)
.FirstOrDefaultAsync(s=>s.PaczkaID==id);
if(paczkaToUpdate==null)
{
返回NotFound();
}
如果(等待TryUpdateModelAsync(
paczkaToUpdate,
“帕茨卡”,
i=>i.1(材料)
{
if(String.IsNullOrWhiteSpace)(
paczkaToUpdate.Material?.Name))
{
paczkaToUpdate.Material=null;
}
wait_context.SaveChangesAsync();
返回页首(“/索引”);
}
返回页();
}
}
和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>
a
名称
P/N
证书
数量
返回列表
我希望Paczka有很多资料。这些材料应该只属于 因为我想在创建Paczka时创建它们

根据您的描述,Paczka和物料应配置为一对多关系。在Paczka类中,使用
List
ICollection
定义导航属性(材质),代码如下:

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; }

}
@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方法中,获取更新值并将数据插入或更新到数据库,屏幕截图如下:

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; }

}
@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>

有关关系和更新相关实体的更多详细信息,请参阅以下文章:


你是说你想让Pazka有很多材料吗?如果是这样,一种材料可以属于不同的Pazka吗?是的,我希望Pazka有很多材料。材质应该只属于一个Paczka,因为我想在创建Paczka时创建它们。