ASP.NET MVC5新增Warehouse时数据库Site_Id为空的修复方案
问题修复方案
导致新增Warehouse时关联Site字段存为NULL、关联数据加载为空的核心原因有2个,按以下步骤修改即可:
修正Warehouse实体的外键定义
你当前代码中SiteID是公共字段而非属性,Entity Framework默认不会将公共字段映射为数据表列,因此框架会自动生成名为Site_Id的外键列,你定义的SiteID字段完全没有参与映射。将SiteID改为和其他字段一致的属性实现即可:' 替换原来的 Public SiteID As Integer <Display(Name:="Site"), Required> Public Property SiteID As Integer修改完成后生成数据迁移更新表结构,删除表中自动生成的多余
Site_Id列,确保外键关联指向SiteID字段。修正POST接口的模型绑定配置
目前Create、Edit两个提交方法的[Bind]特性白名单中没有包含SiteID,即使前端下拉框选择了站点值提交,模型绑定阶段也会自动过滤该字段,不会赋值到Warehouse对象上。将两个方法的Bind配置补充SiteID:' Create方法修改后 Function Create(<Bind(Include:="Id,SiteID,WarehouseID,WarehouseName")> ByVal warehouse As Warehouse) As ActionResult' Edit方法修改后 Function Edit(<Bind(Include:="Id,SiteID,WarehouseID,WarehouseName")> ByVal warehouse As Warehouse) As ActionResult(可选优化)添加关联数据预加载
为避免EF懒加载失效导致列表页站点名称显示为空,修改Index方法的查询逻辑,在查询Warehouse时同步预加载关联的Site数据:' 替换原来的 Dim warehouses = From w In db.Warehouses Dim warehouses = From w In db.Warehouses.Include(Function(w) w.Site)
额外提示:你当前实现的自定义验证逻辑中每次验证都会实例化一个新的数据库上下文且未手动释放,高并发场景下容易触发数据库连接池占用问题,建议复用控制器实例化的db对象完成验证逻辑。
内容的提问来源于stack exchange,提问作者Mohammad Javahery
相关产品推荐
相关产品推荐

