programing

엔티티 프레임워크를 사용하여 수동으로 키 입력

powerit 2023. 9. 15. 21:26
반응형

엔티티 프레임워크를 사용하여 수동으로 키 입력

간단한 데이터베이스 프로젝트를 위해 엔티티 프레임워크 코드를 먼저 사용하려고 하는데 도저히 알 수 없는 문제에 봉착합니다.

저는 EF가 제 테이블의 ID를 매번 1씩 자동으로 설정하고 있다는 것을 알게 되었고, 해당 필드에 대해 수동으로 입력한 값을 완전히 무시했습니다.검색한 결과 이 동작을 비활성화하는 올바른 방법은 다음과 같습니다.

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

하지만 지금 이 오류가 발생하고 있는데 그 이유를 모르겠습니다.

처리되지 않은 예외:시스템.데이터. 엔티티.사회 기반 시설.DbUpdate예외:항목을 업데이트하는 동안 오류가 발생했습니다.자세한 내용은 내부 예외 참조. ---

시스템.데이터.UpdateException:항목을 업데이트하는 동안 오류가 발생했습니다.자세한 내용은 내부 예외를 참조하십시오. ---> 시스템.Data.Sql Client.SqlException: IDENTY_인 경우 'Events' 테이블에 IDENTY 열에 대한 명시적 값을 삽입할 수 없습니다.INSERT가 OFF로 설정되어 있습니다.

도움이 된다면, 여기 해당 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; }
}

미리 감사드립니다.

저는 속성을 선호하기 때문에 가능하면 언제든지 완성도를 위해 대안을 제시합니다.

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

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

참고: 이는 EF Core에서도 작동합니다.

기본적으로 Entity Framework는 정수 기본 키가 데이터베이스 생성된 것으로 가정합니다(속성 추가와 동일).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)아니면 전화하기Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);Fluent API에서 확인할 수 있습니다.

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

   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

실제로는 멍하게 쪼그려 앉았습니다.열에서 ID를 삭제하는 것은 사소한 이 아닙니다.테이블을 삭제하고 다시 만들거나 새 열을 작성한 다음 데이터를 복사하고 외부 키를 수정해야 합니다.따라서 EF가 당신을 위해 그렇게 하지 않는 것은 놀라운 일이 아닙니다.

당신은 어떻게 해야 자신을 위해 최선을 다 할 수 있는지 생각해 볼 필요가 있습니다.마이그레이션을 0으로 롤백하고 지정한 후 처음부터 다시 스캐폴드할 수 있습니다.DatabaseGeneratedOption.None, 또는 마이그레이션을 수동으로 변경하여 테이블을 삭제하고 다시 만들 수 있습니다.

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

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

편집하거나 사용자 지정 마이그레이션 작업을 사용하여 ID 켜기/끄기

언급URL : https://stackoverflow.com/questions/18907411/entering-keys-manually-with-entity-framework

반응형