c# - DbUpdateException“无法保存更改”
问题描述
我正在尝试做的事情:
我正在尝试保存对候选人的多个描述,并在每个描述视图中相应地显示它们。
这是我的控制器:
public IActionResult CandidateHistory(int Id)
{
using (var applicationcontext = new ApplicationContext())
{
var candidate =
applicationcontext.Candidates.AsNoTracking().Include(q =>
q.DescriptionList).Single(q => q.Id == Id);
if (candidate == null)
{
return NotFound();
}
applicationcontext.Candidates.Add(candidate);
return View(candidate);
}
}
[HttpPost, ActionName("CandidateHistory")]
[ValidateAntiForgeryToken]
public IActionResult CandidateHistoryPost([Bind("Description, Title,
DateOfDescription, Saving")]Candidate candidate, int Id)
{
try
{
if (ModelState.IsValid)
{
using (var applicationContext = new ApplicationContext())
{
var candidates =
applicationContext.Candidates.AsNoTracking().Include(q =>
q.DescriptionList).Single(q => q.Id == Id);
//candidates.Description = candidate.Description;
//candidates.Saving = candidate.Saving;
//candidates.Title = candidate.Title;
//candidates.DateOfDescription =
candidate.DateOfDescription;
//candidate.DescriptionList.Add(candidates);
var guardar = candidate;
candidates.Saving = guardar.Saving;
candidates.Title = guardar.Title;
candidates.Description = guardar.Description;
candidates.DateOfDescription = guardar.DateOfDescription;
candidate = candidates;
candidates.DescriptionList.Add(candidate);
candidate.DescriptionList = candidates.DescriptionList;
applicationContext.Candidates.Add(candidate);
applicationContext.SaveChanges();
return RedirectToAction("CandidateHistory");
}
}
}
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.
ModelState.AddModelError("", "Unable to save changes. " +
"Try again, and if the problem persists " +
"see your system administrator.");
}
return View(candidate);
}
这也是我的候选人模型:
public class Candidate : BaseEntity
{
public int Id { get; set; }
public string Name { get; set; }
public int Number { get; set; }
public string ProfileText { get; set; }
public Byte[] CV { get; set; }
public string CVNAME { get; set; }
public List<Profile> ProfileList { get; set; }
public String Description { get; set; }
public Boolean Saving { get; set; }
public string Title { get; set; }
public DateTime DateOfDescription { get; set; }
public List<Candidate> DescriptionList { get; set; }
public Candidate()
{
DescriptionList = new List<Candidate>();
}
}
这是我的观点:
@model HCCBPOHR.Data.Candidate
@{
ViewData["Title"] = "CandidateHistory";
}
<h2>Canidate - @Model.Name</h2>
<label>History</label>
<hr />
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-clock-o fa-fw"></i> History Of @Model.Name
</div>
<div class="panel-body">
@foreach (var Description in Model.DescriptionList)
{
@if (Model.Saving == true)
{
<ul class="timeline">
<li class="timeline">
<div class="timeline-badge">
<i class="fa fa-check"></i>
</div>
<div class="timeline-panel">
<div class="timeline-heading">
<h4 class="timeline-title">@Model.Title</h4>
<p>
<small class="text-muted"><i class="fa fa-
clock-o"></i> @Model.DateOfDescription.ToShortDateString()</small>
</p>
</div>
<div class="timeline-body">
<p>@Model.Description</p>
</div>
</div>
</li>
</ul>
}
@if (Model.Saving == false)
{
<ul class="timeline">
<li class="timeline-inverted">
<div class="timeline-badge">
<i class="fa fa-check"></i>
</div>
<div class="timeline-panel">
<div class="timeline-heading">
<h4 class="timeline-title">Title</h4>
<p>
<small class="text-muted"><i class="fa fa-
clock-o"></i> @Model.DateOfDescription.ToShortDateString()</small>
</p>
</div>
<div class="timeline-body">
<p>@Model.Description</p>
</div>
</div>
</li>
</ul>
}
}
</div>
</div>
<button type="button" class="btn btn-primary" data-toggle="modal" data-
target="#exampleModal" data-whatever="@Model.Saving"> Add History
Description</button>
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog"
aria-
labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<form asp-action="CandidateHistory">
<div asp-validation-summary="ModelOnly" class="text-danger">
</div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger">
</span>
</div>
<div class="form-group">
<label asp-for="Description" class="control-label">
</label>
<input asp-for="Description" class="form-control" />
<span asp-validation-for="Description" class="text-
danger"></span>
</div>
<div class="form-group">
<label>Selects</label>
<select asp-for="Saving" class="form-control">
<option value="false">Candidate </option>
<option value="true">Hitachi</option>s
</select>
</div>
<div class="form-group">
<label asp-for="DateOfDescription" class="form-group" >
</label>
<input asp-for="DateOfDescription" class="form-group" />
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-
default" />
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-
dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
Catch 方法抛出异常,我不明白为什么。
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.
ModelState.AddModelError("", "Unable to save changes. " +
"Try again, and if the problem persists " +
"see your system administrator.");
}
例外是:
{Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“候选人”中插入标识列的显式值。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,操作
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject state&Obj, Boolean dataReady) 在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data .SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite,SqlDataReader ds) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary
2 parameterValues) at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection) --- End of inner exception stack trace --- at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(Tuple
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func3 operation, Func
3 verifySucceeded) 的Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult]( TState state, Func 3 verifySucceeded) 中的 2 个参数值) .EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList
1 entryToSave) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess) 在 Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess) 在 HCCBPOHR.Web.Controllers.HomeController.CandidateHistoryPost(Candidate Candidate, Int32 Id) 在 C :\Users\137258\Documents\hccbpohr\src\Web\Controllers\HomeController.cs:line 628}
解决方案
在例外中,它说An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'Candidates' when IDENTITY_INSERT is set to OFF.
这意味着在 SQL 中,您无法在表中插入主键的值,因为您已将其设置为标识键(例如IDENTITY(1,1)
)。最有可能的是,在您的情况下,密钥将是 ID。在 c# 代码中,在模型类中的字段上添加一个属性。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id{ get; set; }
推荐阅读
- influxdb - 单个硬盘上的多进程 fsync 停顿
- batch-file - 从另一个调用批处理文件不会返回
- javascript - 为什么 material-ui 的 AppBar 会在几次页面重新加载时破坏自己的 css?
- php - 如何在 PHP 中绕过特定连接的 VPN?
- c - 用 MPI_Send 发送一个整数数组,一个微妙的混淆
- javafx - Lambda 表达式 button.setOnAction 在 Main 类之外不起作用
- java - 从列表视图项中读取音频文件
- php - 如何在 PHP 中构建持久对象标识?
- sql-server - Microsoft SSIS 包中的编码
- autodesk-model-derivative - 模型衍生翻译问题