为啥实体框架没有映射我订单中的客户实体?

Posted

技术标签:

【中文标题】为啥实体框架没有映射我订单中的客户实体?【英文标题】: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 子句.. 将整个数据库倾倒在电线上是一个好的开始,让用户不小心使用你的代码 我同意朋友。稍后我会设置一些限制。 【参考方案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答案

以上是关于为啥实体框架没有映射我订单中的客户实体?的主要内容,如果未能解决你的问题,请参考以下文章

多对多(自相关)特定订单实体框架

JPA 2,没有实体映射的连接条件查询

如何使用实体框架将相同的披萨添加到订单表

实体框架 - Linq 中的数据库视图或连接到实体

实体中的业务逻辑并注入 DbContext

实体框架查询以获取子项[重复]