You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:20:20