아래 코드는 복합 키를 추가 할 때까지 제대로 작동했습니다. 복합 키를 추가 한 후에는 기존 레코드 만 편집 할 수 있고 새 레코드를 추가 할 수 없습니다. 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");
}
}
오류 메시지가 분명하지 않습니다. IDENTITY_INSERT를 on으로 설정하는 동안 ID 열에 값을 삽입하려고합니다. – Sami
FluentAPI를 사용하여 '켜기'로 설정하는 방법은 무엇입니까? identity_insert를 활성화하면 내 문제가 해결됩니까? –
[this] (https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql)을 참조하십시오. – Sami