EF6中如何关联SalesOrder与Customer并获取CustomerDisplayName
如何将关联Customer的DisplayName添加到SalesOrder的JSON响应中
我正尝试实例化SalesOrder关联的Customer对象,以便将Customer的DisplayName添加到SalesOrder中。
现有SalesOrder实体类代码
using System; using System.Collections.Generic; using System.Runtime.CompilerServices; #nullable disable namespace DataLayer { public partial class SalesOrder { public SalesOrder() { this.SalesOrderLineItems = new HashSet<SalesOrderLineItem>(); //this.Customer = new Customer().; } public Guid Id { get; set; } public DateTime Date { get; set; } public Guid CustomerID { get; set; } public virtual ICollection<SalesOrderLineItem> SalesOrderLineItems { get; set; } public virtual Customer Customer { get; set; } } }
目前SalesOrder可以正常获取SalesOrderLineItems,但尝试填充Customer实例的所有操作均失败。SalesOrder对象上已有CustomerID外键,我想通过该主键/外键关联获取对应的Customer实例,从而访问cust.DisplayName属性,就像SalesOrder.SalesOrderLineItems那样让Customer对象正确关联到SalesOrder上。
数据库表结构配置
SalesOrder表
USE [Backend] GO /****** Object: Table [dbo].[SalesOrder] Script Date: 12/16/2022 9:20:54 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[SalesOrder]( [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Date] [datetime] NOT NULL, [CustomerID] [uniqueidentifier] NOT NULL, CONSTRAINT [PK_SalesOrder] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[SalesOrder] ADD CONSTRAINT [DF_SalesOrder_ID] DEFAULT (newid()) FOR [ID] GO ALTER TABLE [dbo].[SalesOrder] WITH CHECK ADD CONSTRAINT [FK_SalesOrder_Customer] FOREIGN KEY([CustomerID]) REFERENCES [dbo].[Customer] ([ID]) GO ALTER TABLE [dbo].[SalesOrder] CHECK CONSTRAINT [FK_SalesOrder_Customer] GO
Customer表
USE [Backend] GO /****** Object: Table [dbo].[Customer] Script Date: 12/16/2022 9:29:17 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Customer]( [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [DisplayName] [nvarchar](max) NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [LastName] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[Customer] ADD CONSTRAINT [DF_Customer_ID] DEFAULT (newid()) FOR [ID] GO
API控制器代码(加载SalesOrderLineItems正常)
public JsonResult GetSalesOrderByID(Guid salesorderid) { var context = db.Set<SalesOrder>(); SalesOrder sorder = context.First(s => s.Id == salesorderid); context.Entry(sorder).Collection(l => l.SalesOrderLineItems).Load(); return new JsonResult(sorder); }
当前JSON响应
{ "id": "fea1996f-7569-4556-971c-ecb125a53b53", "date": "2022-10-30T00:00:00", "customerID": "23a85521-d834-47b9-be0a-2d34fde6c2dc", "salesOrderLineItems": [ { "id": "7ca18a2d-1c3c-4ab6-a583-aafe3342f3d2", "salesOrderID": "fea1996f-7569-4556-971c-ecb125a53b53", "productID": "a8ee410e-aba3-45dc-aec3-5be389d98f96", "productDisplayName": "Acme Soap", "quantity": 30, "price": 200 }, { "id": "286997cc-b552-44fd-b7dc-fb60cfe88b61", "salesOrderID": "fea1996f-7569-4556-971c-ecb125a53b53", "productID": "0c56a53a-25c2-4ebf-a859-591edefb2657", "productDisplayName": "Central Widget", "quantity": 200, "price": 1.05 } ], "customer": null }
理想的JSON响应
{ "id": "fea1996f-7569-4556-971c-ecb125a53b53", "date": "2022-10-30T00:00:00", "customerID": "23a85521-d834-47b9-be0a-2d34fde6c2dc", "CustomerDisplayName": "Jack Doe", "salesOrderLineItems": [ { "id": "7ca18a2d-1c3c-4ab6-a583-aafe3342f3d2", "salesOrderID": "fea1996f-7569-4556-971c-ecb125a53b53", "productID": "a8ee410e-aba3-45dc-aec3-5be389d98f96", "productDisplayName": "Acme Soap", "quantity": 30, "price": 200 }, { "id": "286997cc-b552-44fd-b7dc-fb60cfe88b61", "salesOrderID": "fea1996f-7569-4556-971c-ecb125a53b53", "productID": "0c56a53a-25c2-4ebf-a859-591edefb2657", "productDisplayName": "Central Widget", "quantity": 200, "price": 1.05 } ] }
我起初尝试填充完整的Customer对象,但可能没必要。理想状态是仅将Customer.DisplayName作为SalesOrder的一个属性添加,无需整个Customer对象。修改后的SalesOrder类如下:
修改后的SalesOrder实体类
namespace DataLayer { public partial class SalesOrder { public SalesOrder() { this.SalesOrderLineItems = new HashSet<SalesOrderLineItem>(); //this.Customer = new Customer().; } public Guid Id { get; set; } public DateTime Date { get; set; } public Guid CustomerID { get; set; } public virtual ICollection<SalesOrderLineItem> SalesOrderLineItems { get; set; } public virtual string CustomerDisplayName { get; set; } } }
我曾尝试用[ForeignKey]特性修饰SalesOrder类并定义CustomerID,但未生效;也尝试过像加载SalesOrderLineItems那样加载Customer集合,但Customer并不像SalesOrderLineItem那样包含SalesOrder关联关系,Customer是独立的,仅被SalesOrder通过外键引用。
内容的提问来源于stack exchange,提问作者user2288132
相关产品推荐
相关产品推荐

