为啥实体框架没有映射我订单中的客户实体?
Posted
技术标签:
【中文标题】为啥实体框架没有映射我订单中的客户实体?【英文标题】:Why does the entity framework not map the customer entity in my order?为什么实体框架没有映射我订单中的客户实体? 【发布时间】:2021-08-27 22:02:06 【问题描述】:我有一个订单实体,其中包含几个实体Customer
、Store
和其他实体,但实体框架不填充这些实体。我认为关系是错误的,但我找不到实体框架为什么不映射订单中的实体。
Orders
和 Customers
实体:
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】:其中一个选项是通过Include
eager 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答案以上是关于为啥实体框架没有映射我订单中的客户实体?的主要内容,如果未能解决你的问题,请参考以下文章