简体   繁体   English

在实体框架中建立外键关系

[英]Setting up foreign key relationship in Entity Framework

I'm very new to ASP.Net and Entity Framework Core and I'm working on a simple web app where a user can add drinks to a cart and checkout. 我是ASP.Net和Entity Framework Core的新手,我正在开发一个简单的Web应用程序,用户可以在其中将饮料添加到购物车并结帐。 There is also a view with the order history of a user which is where I run into a problem. 还有一个带有用户订购历史的视图,这是我遇到问题的地方。 Each order has an order line which is a list of order details. 每个订单都有一个订单行,该行是订单详细信息的列表。 However, when trying to display the information about the drink from the orderdetail, it's saying that the drink null. 但是,当尝试显示订单详细信息中有关饮料的信息时,则表示饮料为空。 Does anybody know why this is? 有人知道这是为什么吗? Thank you 谢谢

The order model is shown below: 订单模型如下所示:

public class Order
{
    [BindNever]
    public int OrderId { get; set; }

    public string UserId { get; set; }

    public virtual List<OrderDetail> OrderLines { get; set; }

    [Required(ErrorMessage = "Please enter your first name")]
    [Display(Name = "First name")]
    [StringLength(50)]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Please enter your last name")]
    [Display(Name = "Last name")]
    [StringLength(50)]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Please enter your address")]
    [StringLength(100)]
    [Display(Name = "Address Line 1")]
    public string AddressLine1 { get; set; }

    [Display(Name = "Address Line 2")]
    public string AddressLine2 { get; set; }

    [Required(ErrorMessage = "Please enter your zip code")]
    [Display(Name = "Zip code")]
    [StringLength(10, MinimumLength = 4)]
    public string ZipCode { get; set; }


    [Required(ErrorMessage = "Please enter your City")]
    [StringLength(50)]
    public string City { get; set; }

    [Required(ErrorMessage = "Please enter your State")]
    [StringLength(10)]
    public string State { get; set; }

    [Required(ErrorMessage = "Please enter your country")]
    [StringLength(50)]
    public string Country { get; set; }

    [Required(ErrorMessage = "Please enter your phone number")]
    [StringLength(25)]
    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Phone number")]
    public string PhoneNumber { get; set; }

    [Required]
    [StringLength(50)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [BindNever]
    [ScaffoldColumn(false)]
    public decimal OrderTotal { get; set; }

    [BindNever]
    [ScaffoldColumn(false)]
    public DateTime DatePlaced { get; set; }
}

Order Detail Model: 订单明细模型:

public class OrderDetail
{
    public int OrderDetailId { get; set; }

    public int OrderId { get; set; }

    public int DrinkId { get; set; }

    public string DrinkName { get; set; }

    public int Amount { get; set; }

    public decimal Price { get; set; }

    public Drink Drink { get; set; }

    public Order Order { get; set; }
}

Create Order method in OrderRepository: 在OrderRepository中创建Order方法:

    public void CreateOrder(Order order, string userId)
    {
        order.UserId = userId;

        order.DatePlaced = DateTime.Now;
        _appDbContext.Orders.Add(order);

        var shoppingCartItems = _shoppingCart.ShoppingCartItems;

        foreach (var item in shoppingCartItems)
        {
            var orderDetail = new OrderDetail()
            {
                Drink = item.Drink,
                Amount = item.Amount,
                DrinkId = item.Drink.DrinkId,
                DrinkName = item.Drink.Name,
                OrderId = order.OrderId,
                Price = item.Drink.Price
            };

            order.OrderTotal += item.Drink.Price*item.Amount;

            _appDbContext.OrderDetails.Add(orderDetail);
        }


        _appDbContext.SaveChanges();
    }

I also have an OrderHistory ViewModel: 我也有一个OrderHistory ViewModel:

public class OrderHistoryViewModel
{
    public List<Order> OrderHistory { get; set; }
    public List<OrderDetail> OrderLines { get; set; }

}

OrderHistory Action in controller: 控制器中的OrderHistory操作:

public async Task<ActionResult> MyAccount(OrderHistoryViewModel orderHistoryViewModel)
    {
        var user = await GetCurrentUserAsync();

        orderHistoryViewModel = new OrderHistoryViewModel
        {
            OrderHistory = _orderRepository.GetOrdersByCustomerId(user?.Id).ToList(),
            OrderLines = _orderRepository.GetOrderLines(_orderRepository.GetOrdersByCustomerId(user?.Id)).ToList()
        };

        return View(orderHistoryViewModel);
    }

My Account View: 我的帐户视图:

@model orderHistoryViewModel

        @foreach (var order in @Model.OrderHistory)
    {
        @foreach (var orderDetail in order.OrderLines)
        {

            decimal subtotal = orderDetail.Price * orderDetail.Amount;

                <div class="panel-body">
                    <div class="row">
                        <div class="col-md-3"><img src=@orderDetail.Drink.ImageUrl class="media-object thumbnail-image-xs"></div>
                        <div class="col-md-9">
                            <div class="row">
                                <div class="col-lg-12">
                                    <h4><span><strong>@orderDetail.Drink.Name</strong></span></h4>
                                </div>
                                <div class="col-md-12">
                                    <span style="font-weight:600">Quantity: </span> @orderDetail.Amount
                                </div>
                                <div class="col-md-12">
                                    <span style="font-weight:600">Price: </span> @subtotal

                                </div>
                                <div class="col-md-12">
                                    <span style="font-weight:600">Date Placed: </span> @order.DatePlaced.ToShortDateString()
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
        }
    }

Implementations of OrdersByCustomerId and GetOrderLines: OrdersByCustomerId和GetOrderLines的实现:

        public IEnumerable<Order> OrdersByCustomerId(string id)=> _appDbContext.Orders.Where(o => o.UserId == id).OrderByDescending(d => d.DatePlaced);

    public IEnumerable<OrderDetail> GetOrderLines(IEnumerable<Order> orderHistory)
    {
        List<OrderDetail> orderLines = new List<OrderDetail>();
        foreach (var order in orderHistory)
        {
            orderLines.AddRange(_appDbContext.OrderDetails.Where(od => od.OrderId == order.OrderId));
        }

        return orderLines;
    }

I changed orderLines.AddRange(_appDbContext.OrderDetails.Where(od => od.OrderId == order.OrderId)); 我更改了orderLines.AddRange(_appDbContext.OrderDetails.Where(od => od.OrderId == order.OrderId)); to orderLines.AddRange(_appDbContext.OrderDetails.Where(od => od.OrderId == order.OrderId).Include(od => od.Drink); orderLines.AddRange(_appDbContext.OrderDetails.Where(od => od.OrderId == order.OrderId).Include(od => od.Drink);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM