다음을 통해 공유


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 열에 명시적 값을 삽입하는 것을 허용하지 않습니다. 이렇게 하려면 다음과 같이 SaveChangesAsync()호출하기 전에 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" });

    await context.Database.OpenConnectionAsync();
    try
    {
        await context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.Blogs ON");
        await context.SaveChangesAsync();
        await context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.Blogs OFF");
    }
    finally
    {
        await context.Database.CloseConnectionAsync();
    }
}

메모

SQL Server 공급자 내에서 이 작업을 자동으로 수행할 수 있도록 백로그에 기능 요청 있습니다.

시퀀스

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

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

GUID

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; }
}