【发布时间】:2020-04-08 16:53:27
【问题描述】:
我继承了一个应用程序并使用 EntityFrameworks 进行了更改。
更改是为现有表创建 CRUD。我使用 MVC 脚手架来创建控制器和视图。除 Create 外,一切正常。
经过调查,我发现我正在为其创建 CRUD 代码的表具有三个字段:一个自动编号的主字段 (ccID)、一个 nvarchar(50) 字段 (ClosureCode) 和一个位字段 (ccRedundant - 默认 0) ID 字段种子为 1,增量为 1,但它有两条记录的值:
ccID ClosureCode ccRedundant -1 未设置为假 0 不适用 假随后是其他记录。
脚手架代码将 0 作为新记录的 ID 传递,因此 ModelState.IsValid 始终为 False,不会保存新记录。编辑、更新和删除工作正常。
我已尝试在发布前将 ID 的值设置为 -2 和 Integer.MaxValue,但在 ModelState.IsValid 处保存仍然失败,这绝不是真的。
脚手架代码如下:
' POST: ClosureCodes/Create
'To protect from over-posting attacks, please enable the specific properties you want to bind to, for
'more details see https://go.microsoft.com/fwlink/?LinkId=317598.
<HttpPost()>
<ValidateAntiForgeryToken()>
Function Create(<Bind(Include:="ccID,ClosureCode,ccRedundant")> ByVal tblClosureCode As tblClosureCode) As ActionResult
If ModelState.IsValid Then
Try
db.tblClosureCodes.Add(tbClosureCode)
db.SaveChanges()
Return RedirectToAction("Index")
Catch ex As Exception
ErrorLogging.LogExceptionToLogFile(thisClass, "Create", ex)
ViewData("Message") = ErrorLogging.ErrorString(thisClass, "Create", ex, ex.InnerException)
Return RedirectToAction("Error")
End Try
End If
Return View(tblClosureCode)
End Function
我对生成的代码所做的唯一更改是在保存位周围添加一个 try catch,并使用一种方法来记录任何异常并重定向到自定义错误页面,并在 viewData 中显示错误。
我是否认为存在 ccID 0 的记录是 Created 记录无法保存的原因?有没有办法解决这个问题。
更新
请求的 tblClosureCodes 中 ccID 列的属性:
【问题讨论】:
-
你能从你的模型中发布自动增量字段的属性定义吗?据我所知,EF 不应该如何处理这个问题,也不需要设置任何值。 tblClosureCode.ccrID 是否使用 DatabaseGenerated 属性修饰?
-
@RossBush 按要求添加了属性定义
-
该字段未在您的数据库架构中定义为 IDENTITY。
-
@RossBush 抱歉,我必须双击该列并将其设置为否...我已更新图像...该字段定义为 IDENTITY。我怀疑在某个阶段它不是并且添加了 -1 和 0 记录,然后 IDENTITY 设置为种子 1 和增量 1...我想不出其他任何方式来创建这些记录。
-
EF 应该能够处理自增字段。您能否发布该字段的 EF 生成代码定义。是否只想删除 0 和 -1 的记录?
标签: asp.net-mvc vb.net entity-framework