Entity Framework 7에서 낙관적 동시성을 처리하는 가장 좋은 방법

asp.net-core entity-framework-core

문제

ASP.NET 5 rc1 및 엔티티 7 rc1 coreclr 통해 예제 코드를 첫 번째 마이그레이션 프로젝트를 사용하고 있습니다.

엔티티에서 동시성을 관리하는 방법을 살펴 보았지만 엔티티 7에 대한 권장 동시 처리 처리 방법에 대한 좋은 업데이트 된 정보를 찾을 수 없었습니다.

몇 가지 엔티티가 있는데, 모두 인터페이스를 구현합니다.

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

예 :

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

각 RowVersion 열에 [Timestamp] 속성을 추가하는 대신 유창한 구성을 사용하는 것을 선호합니다. 따라서 DbContext에서 각 열을 행 버전으로 처리하도록 각 엔티티를 지정합니다.

그러나 엔터티 7은 더 이상 옵션을 지원하지 않는 것 .IsRowVersion() 하지만 옵션이 IsConcurrencyToken() 충분하지만 코드 첫 번째 마이그레이션에서이 널 (NULL) VARBINARY 컬럼을 생성 / 업데이트 행을 삽입 할 때 그렇지 않은 자동 증가를 수행한다, .

가장 좋은 방법은 명시 적으로 데이터베이스의 엔티티를 업데이트하거나 삽입 할 때 버전을 증가시켜 각 행의 버전을 명시 적으로 관리하는 것입니다. 이것이 내 DbContext입니다.

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

기본적으로 내 질문은 어떻게 ASP.NET 5 및 엔터티 7 동시성을 처리 할 수 ​​있습니다? 이 일을 처음 처리 할 때나 어떤 제안이라도 감사 할 것입니다.

업데이트 : https://stackoverflow.com/users/1922568/joe-audette 링크 덕택에 불행히도 모든 답변을 찾지 못했습니다.

http://docs.efproject.net/en/latest/modeling/concurrency.html#how-concurrency-tokens-work-in-ef에 따라 행이나 ConcurrencyCheck 주석의 버전을 지정하려면 Timestamp 주석을 사용할 수있는 것 같습니다. 속성 (전체 행이 아닌)을 기반으로 버전을 만들고 싶다면 속성에 추가하십시오.

유창한 API는 .IsConcurrencyToken() 을 사용하여 동시성 토큰을 구성하는 것만 허용합니다.

전 유창한 API를 통해 전용 열로 전체 행을 버전 화하는 방법을 찾지 못했습니다 (유창한 API가 .IsRowVersion() 허용하면 .IsRowVersion() . 그러나 그렇지 않습니다)

인기 답변

내가 EF7 모델 빌더의이 처리하는 정적 클래스 및 기타 실종 기능 만든 (주의 사용을 프로덕션 환경에서 테스트되지 않음)

public static class SqlServerModelBuilderExtensions
{
    public static PropertyBuilder<decimal?> HasPrecision(this PropertyBuilder<decimal?> builder, int precision, int scale)
    {
        return builder.HasColumnType($"decimal({precision},{scale})");
    }

    public static PropertyBuilder<decimal> HasPrecision(this PropertyBuilder<decimal> builder, int precision, int scale)
    {
        return builder.HasColumnType($"decimal({precision},{scale})");
    }

    public static PropertyBuilder<byte[]> IsRowVersion(this PropertyBuilder<byte[]> builder)
    {
        return builder.HasColumnType("rowversion").IsConcurrencyToken().ValueGeneratedOnAdd();
    }
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.