Entity Framework에서 수동으로 키 입력

asp.net c# entity-framework entity-framework-core sql

문제

나는 간단한 데이터베이스 프로젝트를 위해 Entity Framework 코드를 먼저 사용하려고 노력하고 있는데, 나는 알아낼 수없는 문제에 직면했다.

나는 EF가 테이블에 대한 ID를 매번 1 씩 자동으로 증가시키고 그 필드에 대해 수동으로 입력 한 값을 완전히 무시한다는 것을 알아 차렸다. 일부 검색을 한 후에는이 동작을 사용하지 않도록 설정하는 올바른 방법은 다음과 같습니다.

modelBuilder.Entity<Event>().Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

그러나 지금은이 오류가 발생하고 이유를 모르겠습니다.

처리되지 않은 예외 : System.Data.Entity.Infrastructure.DbUpdateException : 항목을 업데이트하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오. ---

System.Data.UpdateException : 항목을 업데이트하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오. ---> System.Data.SqlClient.SqlException : IDENTITY_INSERT가 OFF로 설정된 경우 '이벤트'테이블에 ID 열에 명시 적 값을 삽입 할 수 없습니다.

도움이된다면 여기 POCO 클래스가 있습니다.

public class Event
{
    [Key, Required]
    public int EventID { get; set; }

    public string EventType { get; set; } //TODO: Event Type Table later on
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
    public virtual ICollection<EventParticipation> EventParticipation { get; set; }
}

미리 감사드립니다.

수락 된 답변

기본적으로 Entity Framework는 정수 기본 키가 데이터베이스 생성 ( HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 특성을 추가하거나 Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 호출하는 것과 동일 Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 합니다.

테이블을 만드는 마이그레이션을 보면 다음과 같이 표시됩니다.

   CreateTable(
                "dbo.Events",
                c => new
                    {
                        EventID = c.Int(nullable: false, identity: true),
                        //etc
                    })
                .PrimaryKey(t => t.EventID );

그런 다음 Fluent API를 사용하여 DatabaseGenerated.None 모델을 변경했습니다. EF는 이것을 마이그레이션에 넣습니다.

AlterColumn("dbo.Events", "EventID", c => c.Int(nullable: false, identity: false))

생성 된 SQL은 다음과 같습니다.

ALTER TABLE [dbo].[Events] ALTER COLUMN [EventID] [int] NOT NULL

실제로 diddly 웅크 리기. IDENTITY 를 열에서 삭제하는 것은 쉬운 일 이 아닙니다. 테이블을 삭제하고 다시 작성하거나 새 열을 작성해야합니다. 그런 다음 데이터를 복사하고 외부 키를 수정해야합니다. 그래서 EF가 당신을 위해 그렇게하지 않는다는 것은 놀라운 일이 아닙니다.

너 자신을 위해 최선을 다하는 방법을 찾아야 해. DatabaseGeneratedOption.None 을 지정 했으므로 마이 그 레이션을 0으로 롤백하고 처음부터 다시 스캐 폴딩하거나 수동으로 마이 그 레이션을 변경하여 테이블을 삭제하고 다시 만들 수 있습니다.

또는 열을 삭제하고 다시 만들 수 있습니다.

DropColumn("Customer", "CustomerId"); 
AddColumn("Customer", "CustomerId", c => c.Long(nullable: false, identity: false));

편집 또는 사용자 지정 마이그레이션 작업을 사용하여 신원을 설정 / 해제 할 수 있습니다.


인기 답변

나는 속성을 선호하기 때문에, 여기서는 완성을 위해 대안을 제시한다 :

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }

참고 : 이것은 EF 코어에서도 작동합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.