ASP.NET MVC+EF项目单条数据库条目数据处理方案咨询
ASP.NET MVC + Entity Framework 分步企业信息收集优化方案
问题背景
我基于ASP.NET MVC和Entity Framework开发企业信息收集表单网站,涉及两张数据表:
- Companies表:核心字段为
CompanyID(主键)、CompanyName - Processes表:核心字段为
ProcessNo(主键)、CompanyID(外键关联Companies)、ProcessName、Description
当前实现会加载全量企业及流程数据,数据量大时性能严重下降。需要优化为两步流程:
- 用户先填写企业信息,提交后获取
CompanyID,跳转至对应企业的流程表单 - 全程仅处理当前单条企业数据,不加载DbSet中的全量数据
现有两个表单功能可用但不符合需求,因保密无法提供代码,寻求同类实现思路参考。
数据表结构SQL
CREATE TABLE [dbo].[Companies] ( [CompanyID] [smallint] NOT NULL, [CompanyName] [nvarchar](max) NULL, PRIMARY KEY CLUSTERED ([CompanyID] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO CREATE TABLE [dbo].[Processes] ( [ProcessNo] [smallint] NOT NULL, [CompanyID] [smallint] NOT NULL, [ProcessName] [nvarchar](max) NULL, [Description] [nvarchar](max) NULL, PRIMARY KEY CLUSTERED ([ProcessNo] ASC, [CompanyID] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[Processes] WITH CHECK ADD FOREIGN KEY([CompanyID]) REFERENCES [dbo].[Companies] ([CompanyID]) GO
注:修正了Processes表主键定义的笔误(原SQL中写的ProcessID应为ProcessNo)
核心实现思路
1. 企业信息提交与跳转流程
- Companies控制器的Create动作:
- GET请求返回企业信息表单视图,仅渲染单条企业的输入字段,无需加载任何现有企业数据
- POST请求接收表单提交的企业实体,添加到
DbContext.Companies,调用SaveChanges()后获取生成的CompanyID - 通过
RedirectToAction("Create", "Processes", new { companyId = 新生成的CompanyID })跳转至流程表单页面
2. 关联企业的流程表单处理
- Processes控制器的Create动作:
- 接收
companyId参数,在GET动作中初始化Process实体并绑定CompanyID,传递给视图 - 视图中用隐藏字段存储
CompanyID,确保提交时自动绑定 - POST请求接收绑定了
CompanyID的Process实体,直接添加到DbContext.Processes并保存,无需查询全量数据
- 接收
3. 性能优化关键
- 始终通过
Where(c => c.CompanyID == 目标ID)过滤数据,禁止直接调用DbSet.ToList()加载全量数据 - 如需查询当前企业的流程,使用
dbContext.Processes.Where(p => p.CompanyID == companyId).ToList()而非加载所有流程 - 只读场景下使用
AsNoTracking()减少EF的跟踪开销,例如:dbContext.Companies.AsNoTracking().FirstOrDefault(c => c.CompanyID == companyId) - 关闭不必要的懒加载,避免意外加载关联数据(可在DbContext构造函数中设置
this.Configuration.LazyLoadingEnabled = false;)
内容的提问来源于stack exchange,提问作者vesadeceeger
相关产品推荐
相关产品推荐

