source

Entity Framework Core를 사용하여 부분 기본 키의 자동 증가

manycodes 2023. 6. 20. 21:43
반응형

Entity Framework Core를 사용하여 부분 기본 키의 자동 증가

EF Core fluent API를 사용하여 다음 모델을 선언했습니다.

modelBuilder.Entity<Foo>()
    .HasKey(p => new { p.Name, p.Id });

Postgre에서 데이터베이스를 작성할 때 두 필드가 기본 키로 표시됩니다.SQL이지만 ID 필드가 자동 증분으로 표시되지 않습니다.나는 또한 추가하려고 노력했습니다.

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Foo 아래의 ID 필드로 이동합니다. 마이그레이션 코드에 차이가 없습니다.PPK인데 Id AI를 만드는 방법이 있나요?

음, 그 데이터 주석들은 효과가 있을 것입니다, 아마도 포스트그레와 관련이 있을 것입니다.SQL 공급자.

EF Core 문서에서 확인:

사용 중인 데이터베이스 공급자에 따라 EF 또는 데이터베이스에서 값이 클라이언트 쪽으로 생성될 수 있습니다.값이 데이터베이스에서 생성된 경우 EF는 컨텍스트에 엔티티를 추가할 때 임시 값을 할당할 수 있습니다.그러면 이 임시 값이 다음 기간 동안 데이터베이스 생성 값으로 대체됩니다.SaveChanges.

다음 Fluent API 구성을 사용해 볼 수도 있습니다.

modelBuilder.Entity<Foo>()
            .Property(f => f.Id)
            .ValueGeneratedOnAdd();

그런데 아까 말씀드린 것처럼 DB 제공자와 관련된 부분이라고 생각합니다.DB에 새 행을 추가하고 나중에 값이 생성되었는지 확인합니다.Id기둥.

우선 Fluent API를 데이터 주석과 병합해서는 안 되므로 다음 중 하나를 사용하는 것이 좋습니다.

키를 올바르게 설정했는지 확인합니다.

modelBuilder.Entity<Foo>()
            .HasKey(p => new { p.Name, p.Id });
modelBuilder.Entity<Foo>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

또는 데이터 주석을 사용하여 이를 달성할 수도 있습니다.

public class Foo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key, Column(Order = 0)]
    public int Id { get; set; }

    [Key, Column(Order = 1)]
    public string Name{ get; set; }
}

SQL Server Database를 사용하고 있으며 int 기본 키에 다음 주석을 추가한 후에도 예외가 발생한 경우 이 문제를 발견한 모든 사용자에게

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

SQL을 확인하고 기본 키 옆에 IDENTITY(startValue, increment)가 있는지 확인하십시오.

CREATE TABLE [dbo].[User]
(
    [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY
)

이렇게 하면 새 행이 추가될 때마다 id가 증가하며 시작 값은 1, 증분은 1이 됩니다.

저는 실수로 제 인생의 한 시간을 허비한 SQL에서 그것을 간과했습니다. 그래서 이것이 누군가에게 도움이 되기를 바랍니다!!!

아래와 같은 속성 주석 달기

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }

새 모델의 모든 값 생성 속성에 ID 열을 사용하려면 컨텍스트의 OnModelCreating()에 다음을 배치하면 됩니다.

builder.ForNpgsqlUseIdentityColumns();

이렇게 하면 의 모든 키 및 기타 속성을 만들 수 있습니다.ValueGeneratedOnAdd()에는 기본적으로 ID가 있습니다.ForNpgsqlUseIdentity를 사용할 수 있습니다.AlwaysColumns()는 항상 ID를 가져야 하며 UseNpgsqlIdentityColumn() 및 UseNpgsqlIdentity를 사용하여 속성별로 ID를 지정할 수도 있습니다.항상 열().

사후 greesfcore 값 생성

Postgre의 열 유형을 일련 번호로 지정ID를 생성할 SQL입니다.

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order=1, TypeName="serial")]
public int ID { get; set; }

https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL

언급URL : https://stackoverflow.com/questions/36155429/auto-increment-on-partial-primary-key-with-entity-framework-core

반응형