添加合成后,我无法保存记录
问题描述:
下面的代码工作正常,直到添加组合键。添加复合键后,我只能编辑现有的记录,无法添加新的记录。我想Code
和CompanyId
列成为组合键。添加合成后,我无法保存记录
这是错误:
Cannot insert explicit value for identity column in table 'CostCenters' when IDENTITY_INSERT is set to OFF.
寻找SO解决方案后及以下线路添加(仍然没有进展):
Property(c => c.CompanyId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
型号:
public class CostCenter
{
public int Id { get; set; }
public string Code { get; set; }
public string Description { get; set; }
[ScriptIgnore(ApplyToOverrides = true)]
public virtual Company Company { get; set; }
public int CompanyId { get; set; }
}
FluentAPI:
public CostCenterConfiguration()
{
HasKey(c => new { c.Code, c.CompanyId });
Property(c => c.CompanyId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Property(c => c.Code)
.IsRequired()
.HasMaxLength(255);
Property(c => c.Description)
.HasMaxLength(1200);
HasRequired(c => c.Company)
.WithMany(c => c.CostCenters)
.HasForeignKey(c => c.CompanyId)
.WillCascadeOnDelete(false);
}
控制器:
public ActionResult Save(CostCenter costcenter)
{
try
{
if (costcenter.Id == 0)
_context.CostCenters.Add(costcenter);
else
{
var costcenterInDb = _context.CostCenters.Single(c => c.Id == costcenter.Id);
costcenterInDb.Code = costcenter.Code;
costcenterInDb.Description = costcenter.Description;
costcenterInDb.CompanyId = costcenter.CompanyId;
}
_context.SaveChanges();
return RedirectToAction("Index", "CostCenters");
}
catch (System.Data.Entity.Validation.DbEntityValidationException ex)
{
var error = ex.EntityValidationErrors.First().ValidationErrors.First();
this.ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
return View("CostCenterForm");
}
catch (DbUpdateException e) when ((e?.InnerException?.InnerException as System.Data.SqlClient.SqlException)?.Number == 2601)
{
this.ModelState.AddModelError("Code", "Item with such '" + costcenter.Code + "' already exist");
return View("CostCenterForm");
}
}
答
Cannot insert explicit value for identity column in table 'CostCenters' when IDENTITY_INSERT is set to OFF.
错误信息是明确的也有帮助,你试图将值插入到IDENTITY
列,而IDENTITY_INSERT设置为OFF
。
我建议删除该值,让SQL服务器做的工作,但如果你坚持要插入值,那么你应该设置IDENTITY_INSERT
到ON
并再次将其设置为OFF
完成刚过:
SET IDENTITY_INSERT Schema.TableName ON;
GO
-- do your insert
SET IDENTITY_INSERT Schema.TableName OFF;
GO
错误消息很明显,您尝试在IDENTITY_INSERT设置为打开时将值插入标识列。 – Sami
如何使用FluentAPI设置'on'?通过启用identity_insert将解决我的问题? –
阅读[this](https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql) – Sami