다음을 통해 공유


SQL Server 값 생성

이 페이지에서는 SQL Server 공급자와 관련된 값 생성 구성 및 패턴에 대해 자세히 설명합니다. 먼저 값 생성에 대한 일반 페이지를 읽는 것이 좋습니다.

IDENTITY 열

규칙에 따라 추가 시 해당 값이 생성되도록 구성된 숫자 열은 SQL Server IDENTITY 열로 설정됩니다.

시드 및 증분

기본적으로 IDENTITY 열은 1(시드)에서 시작되고 행이 추가(증분)될 때마다 1씩 증가합니다. 다음과 같이 다른 시드 및 증분을 구성할 수 있습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .UseIdentityColumn(seed: 10, increment: 10);
}

IDENTITY 열에 명시적 값 삽입

기본적으로 SQL Server IDENTITY 열에 명시적 값을 삽입하는 것을 허용하지 않습니다. 이렇게 하려면 다음과 같이 SaveChanges()를 호출하기 전에 수동으로 IDENTITY_INSERT를 사용하도록 설정해야 합니다.

using (var context = new ExplicitIdentityValuesContext())
{
    context.Blogs.Add(new Blog { BlogId = 100, Url = "http://blog1.somesite.com" });
    context.Blogs.Add(new Blog { BlogId = 101, Url = "http://blog2.somesite.com" });

    context.Database.OpenConnection();
    try
    {
        context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Blogs ON");
        context.SaveChanges();
        context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Blogs OFF");
    }
    finally
    {
        context.Database.CloseConnection();
    }
}

참고 항목

SQL Server 공급자 내에서 자동으로 이 작업을 수행하려면 백로그에 기능 요청이 있어야 합니다.

시퀀스

IDENTITY 열 대신 표준 시퀀스를 사용할 수 있습니다. 다양한 시나리오에서 유용할 수 있습니다. 예를 들어 여러 열이 단일 시퀀스에서 기본값을 그리도록 할 수 있습니다.

SQL Server 시퀀스를 만들고 시퀀스의 일반 페이지에 자세히 설명된 대로 사용할 수 있습니다. HasDefaultValueSql()을 통해 시퀀스를 사용하도록 속성을 구성하는 것은 사용자에게 달려 있습니다.

GUIDs

GUID 기본 키의 경우 공급자는 SQL Server의 NEWSEQUENTIALID 함수와 유사한 최적의 순차 값을 자동으로 생성합니다. 클라이언트에서 값을 생성하는 것은 일부 시나리오에서 더 효율적입니다. 즉, 해당 키를 참조하는 종속 항목이 삽입될 때 데이터베이스 생성 값을 가져오는 데 추가 데이터베이스 왕복이 필요하지 않습니다.

EF가 키가 아닌 속성에 대해 동일한 순차 GUID 값을 생성하도록 하려면 다음과 같이 구성합니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}

Rowversions

SQL Server에는 행이 업데이트할 때마다 자동으로 변경되는 rowversion 데이터 형식이 있습니다. 이렇게 하면 동일한 행이 여러 트랜잭션에 의해 동시에 업데이트되는 경우를 관리하기 위해 동시성 토큰으로 매우 유용합니다.

동시성 토큰 및 사용 방법을 완전히 이해하려면 동시성 충돌 전용 페이지를 읽어보세요. byte[] 속성을 rowversion 열에 매핑하려면 다음과 같이 구성합니다.

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [Timestamp]
    public byte[] Version { get; set; }
}