库存、订单商品和订单

Inventory, OrderItems and Order

我现在面临的问题是我有多个订单,每个订单包含多个项目。每个订单必须 link 给客户,每个项目必须 link 给库存项目。 这是我的订单 Class

public class Order
    {
        [Key]
        public int Id { get; set; }

        public int TotalItems { get; set; }

        public DateTime DeliveryDate { get; set; }

        public string OrderNumber { get; set; }

        public int ClientId { get; set; }
        [ForeignKey("ClientId")]
        public string DeliveryAddress { get; set; }

        public List<OrderItem> OrderItems { get; set; }
        public Client Clients { get; set; }
}

订单项Class

 public class OrderItem
    {
        public int Id { get; set; }

        public int OrderId{ get; set; }
        [ForeignKey("OrderId")]

        public int InventoryInfoId { get; set; }
        [ForeignKey("InventoryInfoId")]

        [Required]
        public string ItemCode { get; set; }
        public int Quantity { get; set; }
        public InventoryInfo InventoryInfo { get; set; }
        public Order Order { get; set; }
    }

知道如何 link 他们吗?

我想我已经解决了上面的问题

我一处理,下一个问题就出来了

 @foreach (var item in Model)
    {
    <tr>
        <td>
            @Html.DisplayFor(m => item.OrderNumber)
        </td>
        <td>
            @Html.DisplayFor(m=> item.DeliveryAddress)
        </td>
        <td>
            @Convert.ToDateTime(item.DeliveryDate).ToString("dd-MM-yyyy")
        </td>
        <td>
            @Html.DisplayFor(m=>item.Client.ClientCode)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TotalItems)
        </td>
        <td>
            <a asp-action="Edit" asp-route-id="@item.Id" class="btn btn-success">Edit</a> 
            <a asp-controller="OrderItem" asp-action="OrderDetail" asp-route-id="@item.Id" class="btn btn-success">Details</a> 
            <a asp-action="Delete" asp-route-id="@item.Id" class="btn btn-success">Delete</a> 

        </td>
    </tr>
    }

这是我的订单索引页面,单击详细信息按钮后,该页面应重定向到 OrderItems 页面。然而它没有。

@model List<IOSystem.Models.OrderItem>
 @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(m => item.ItemCode)
            </td>
            <td>
                @Html.DisplayFor(m => item.Quantity)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |

                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }

这是错误消息。

InvalidOperationException:传入 ViewDataDictionary 的模型项的类型为 'System.Collections.Generic.List1[IOSystem.Models.Order]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.List1[IOSystem.Models.OrderItem]'。

忘记添加我的控制器

[HttpPost, ActionName("OrderDetail")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> OrderDetailPost(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var orderItems = await _context.Orders.Include(s=>s.OrderItems).FirstOrDefaultAsync(i => i.OrderItemId == id);
            
            return View(orderItems);
        }

您的 InvalidOperationException 表示您传递的是 List<Order> 但 Razor 页面中的模型是 List<OrderItem>

在您的控制器代码中:

[HttpPost, ActionName("OrderDetail")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> OrderDetailPost(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var orderItems = await _context.Orders.Include(s=>s.OrderItems).FirstOrDefaultAsync(i => i.OrderItemId == id);
    
    return View(orderItems);
}

您正在访问 _context.Orders,这是您的 Orders table。您 .Include-ing OrderItems 但您返回 Orders.

var orderItems = ... 传回 OrderItems 或将 Razor 页面的模型调整为 List<Order>

如果你想在控制器代码中 select 来自 OrderOrderItems,请将你的 LINQ 语句更新为:

var orderItems = (await _context.Order
    .Include(s => s.OrderItems)
    .FirstOrDefaultAsync(i => i.OrderItemId == id))
    .Select(x => x.OrderItems); // <-- grab just the OrderItems