【问题标题】:Why does the entity framework not map the customer entity in my order?为什么实体框架没有映射我订单中的客户实体?
【发布时间】:2021-08-27 22:02:06
【问题描述】:

我有一个订单实体,其中包含几个实体CustomerStore 和其他实体,但实体框架不填充这些实体。我认为关系是错误的,但我找不到实体框架为什么不映射订单中的实体。

OrdersCustomers 实体:

public partial class Orders
{
    public Orders()
    {
        OrderItems = new HashSet<OrderItems>();
    }

    public int OrderId { get; set; }
    public int? CustomerId { get; set; }
    public byte OrderStatus { get; set; }
    public DateTime OrderDate { get; set; }
    public DateTime RequiredDate { get; set; }
    public DateTime? ShippedDate { get; set; }
    public int StoreId { get; set; }
    public int StaffId { get; set; }

    public virtual Customers Customer { get; set; }
    public virtual Staffs Staff { get; set; }
    public virtual Stores Store { get; set; }
    public virtual ICollection<OrderItems> OrderItems { get; set; }
}

public partial class Customers
{
    public Customers()
    {
        Orders = new HashSet<Orders>();
    }

    public int CustomerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }

    public virtual ICollection<Orders> Orders { get; set; }
}

实体框架代码片段:

        modelBuilder.Entity<Orders>(entity =>
        {
            entity.HasKey(e => e.OrderId)
                .HasName("PK__orders__46596229F9C56686");

            entity.ToTable("orders", "sales");

            entity.Property(e => e.OrderId).HasColumnName("order_id");

            entity.Property(e => e.CustomerId).HasColumnName("customer_id");

            entity.Property(e => e.OrderDate)
                .HasColumnName("order_date")
                .HasColumnType("date");

            entity.Property(e => e.OrderStatus).HasColumnName("order_status");

            entity.Property(e => e.RequiredDate)
                .HasColumnName("required_date")
                .HasColumnType("date");

            entity.Property(e => e.ShippedDate)
                .HasColumnName("shipped_date")
                .HasColumnType("date");

            entity.Property(e => e.StaffId).HasColumnName("staff_id");

            entity.Property(e => e.StoreId).HasColumnName("store_id");

            entity.HasOne(d => d.Customer)
                .WithMany(p => p.Orders)
                .HasForeignKey(d => d.CustomerId)
                .OnDelete(DeleteBehavior.Cascade)
                .HasConstraintName("FK__orders__customer__0F4872E8");

            entity.HasOne(d => d.Staff)
                .WithMany(p => p.Orders)
                .HasForeignKey(d => d.StaffId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK__orders__staff_id__1130BB5A");

            entity.HasOne(d => d.Store)
                .WithMany(p => p.Orders)
                .HasForeignKey(d => d.StoreId)
                .HasConstraintName("FK__orders__store_id__103C9721");
        });

控制器代码:

Postman 中的响应:

【问题讨论】:

  • 可能想在你的控制器中放一些 Where 子句.. 将整个数据库倾倒在电线上是一个好的开始,让用户不小心使用你的代码
  • 我同意朋友。稍后我会设置一些限制。

标签: c# visual-studio api entity-framework postman


【解决方案1】:

其中一个选项是通过Includeeager load 他们:

return await _context.Orders
    .Include(o => o.Customer)
    .Include(o => o.Staff)
    .Include(o => o.Store)
    .ToListAsync()

有关更多信息和选项,请查看"Loading Related Data" doc

【讨论】:

  • 它在我调试 API 时工作,但是当我发出请求 (POSTMAN - GET) 时,我得到一个“500 内部服务器错误”。 VS2019 调试控制台向我抛出以下“检测到不支持的可能对象循环。这可能是由于循环或对象深度大于最大允许深度 32”。
  • @Aetos2501 请查看this答案
猜你喜欢
  • 2010-10-09
  • 2017-02-11
  • 2011-03-09
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多