복붙노트

[SQL] 엔티티 프레임 워크 수동으로 키를 입력

SQL

엔티티 프레임 워크 수동으로 키를 입력

나는 간단한 데이터베이스 프로젝트에 대한 첫 번째 엔티티 프레임 워크 코드를 사용하려고 해요 그리고 내가 간단하게 알아낼 수없는 문제로 실행합니다.

나는 EF 완전히 내가 그 필드에 수동으로 입력 한 값을 무시하고, 자동으로 1마다 증가 내 테이블에 대한 ID를 설정 알게되었다. 일부 검색 후에는이 동작을 해제하는 올바른 방법이하고있는 것을 나의 이해는 다음과 같습니다

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

그러나 지금은 그냥이 오류가 그리고 난 아무 생각도 이유가 없다 :

것이 도움이 있다면, 여기에 문제의 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; }
}

미리 감사드립니다.

해결법

  1. ==============================

    1.기본적으로 엔티티 프레임 워크는 정수 기본 키 데이터베이스 생성 (속성 HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)를 추가하거나 속성을 호출하는 것과 같습니다 있다고 가정합니다 (예 => e.EventID) .HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)하며 유창함 API한다.

    기본적으로 엔티티 프레임 워크는 정수 기본 키 데이터베이스 생성 (속성 HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)를 추가하거나 속성을 호출하는 것과 같습니다 있다고 가정합니다 (예 => e.EventID) .HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)하며 유창함 API한다.

    당신은 당신이 볼 수 테이블을 생성하는 마이그레이션을 보면 :

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

    그럼 당신은 DatabaseGenerated.None에 유창함 API를 사용하여 모델을 변경. EF는 마이그레이션이를두고 :

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

    그리고 생성 된 SQL이 있습니다 :

    ALTER TABLE [dbo가]. [이벤트] ALTER COLUMN에 [이벤트 ID] [INT] NOT NULL

    어떤 실제로 diddly 쪼그리고 않습니다. 열에서 IDENTITY를 제거하면 사소한 없습니다. 그런 다음 데이터를 복사 및 외래 키를 수정해야 테이블을 삭제하고 다시 만들거나 새 열을 작성해야합니다. EF 당신을 위해 그 일을하지 않는 것은 놀라운 일이 아니다 그래서.

    당신은 최고의 자신을 위해 그것을 어떻게 해결해야합니다. 당신은 당신이 DatabaseGeneratedOption.None 지정했는지 지금은 처음부터 0 다시 비계로 마이그레이션을 롤백 할 수 있습니다, 또는 당신은 테이블을 삭제하고 다시 수동으로 마이그레이션을 변경할 수 있습니다.

    또는 당신은 삭제하고 열을 다시 만들 수 있습니다 :

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

    편집하다 또는 사용자 정의 마이그레이션 작업을 통해 신원 온 / 오프 스위치 수

  2. ==============================

    2.나는 속성, 완성도를 위해서 여기에 대안을 선호하기 때문에 :

    나는 속성, 완성도를 위해서 여기에 대안을 선호하기 때문에 :

    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    

    참고 :이 EF 코어도 작동합니다.

  3. from https://stackoverflow.com/questions/18907411/entering-keys-manually-with-entity-framework by cc-by-sa and MIT license