2017-11-18 23 views
0

아래 코드는 복합 키를 추가 할 때까지 제대로 작동했습니다. 복합 키를 추가 한 후에는 기존 레코드 만 편집 할 수 있고 새 레코드를 추가 할 수 없습니다. CodeCompanyId 열을 복합 키로 지정합니다.합성물을 추가 한 후 레코드를 저장할 수 없었습니다

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"); 
     } 
    } 
+0

오류 메시지가 분명하지 않습니다. IDENTITY_INSERT를 on으로 설정하는 동안 ID 열에 값을 삽입하려고합니다. – Sami

+0

FluentAPI를 사용하여 '켜기'로 설정하는 방법은 무엇입니까? identity_insert를 활성화하면 내 문제가 해결됩니까? –

+1

[this] (https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql)을 참조하십시오. – Sami

답변

0

Cannot insert explicit value for identity column in table 'CostCenters' when IDENTITY_INSERT is set to OFF.

오류 메시지가 분명하던 당신도 IDENTITY_INSERT 동안 IDENTITY 컬럼에 값을 삽입하려고 도움OFF으로 설정됩니다.

내가 그 값을 제거하고 SQL Server가 일을 할 수 있도록 건의 할 것입니다,하지만 당신은 값을 삽입 주장하는 경우 다음 ONIDENTITY_INSERT을 설정해야하고 완료 직후에 다시 OFF로 설정 :

SET IDENTITY_INSERT Schema.TableName ON; 
GO 
-- do your insert 
SET IDENTITY_INSERT Schema.TableName OFF; 
GO