Entity Framework 7 데이터 주석 지원 [DatabaseGenerated (DatabaseGeneratedOption.Identity)] Guid 형식 기본 키

entity-framework-core

문제

모든 엔티티의 기반으로 사용하는 엔티티 기본 클래스가 있습니다.

    public abstract class EntityBase : IEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id
    {
        get
        {
            return _id;
        }

        set
        {
            if (_id.Equals(default(Guid)))
                _id = value;

            if (_id.Equals(value))
                return;

            throw new InvalidOperationException("Primary Keys cannot be changed.");
        }
    }
    Guid _id = default(Guid);

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

그러나 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 는 나타나지 않습니다 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

어떤 효과가있다.

생성 된 마이그레이션은 다음과 같은 CreateTable 메서드에 있습니다.

    public abstract class EntityBase : IEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id
    {
        get
        {
            return _id;
        }

        set
        {
            if (_id.Equals(default(Guid)))
                _id = value;

            if (_id.Equals(value))
                return;

            throw new InvalidOperationException("Primary Keys cannot be changed.");
        }
    }
    Guid _id = default(Guid);

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

이되어야합니다 :

    public abstract class EntityBase : IEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id
    {
        get
        {
            return _id;
        }

        set
        {
            if (_id.Equals(default(Guid)))
                _id = value;

            if (_id.Equals(value))
                return;

            throw new InvalidOperationException("Primary Keys cannot be changed.");
        }
    }
    Guid _id = default(Guid);

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

엔티티 프레임 워크 7에서 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 가 더 이상 지원되지 않습니까? 또는 나는 무엇인가 놓치고 있냐?

수락 된 답변

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 는 EF7에서 지원됩니다.

EF7로 인해 다양한 데이터베이스 제공 업체가 마이그레이션에 저장되는 방식이 변경되었습니다. 모든 공급자가 ID 열을 지원하지는 않기 때문에 identity 매개 변수가 없습니다. 대신 공급자 별 주석으로 저장됩니다. 따라서 열이 SQL-Server 특정 IDENTITY 열로 사용될 때 다음 구문을 볼 수 있습니다.

     Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),

DatabaseGeneratedOption.Identity 의의 L 의미는 이전과 같습니다. 데이터베이스는 새로운 행이 추가 될 때 값을 생성합니다. SQL-Server를 대상으로 할 때 정수 유형 속성에 지정된 경우 EF7은 Identity 유형 열을 만듭니다. IDENTITY 는 정수가 아닌 유형 또는 숫자가 아닌 유형에 지정할 수 없기 때문에 다른 유형의 경우 해당 주석이 없습니다. 이 속성에는 여전히 새로운 행을 추가하면 값이 생성되는 기능이 있습니다.

귀하의 예제에서 속성은 SQL Server의 uniqueidentifier 유형으로 변환되는 Guid 유형입니다. 이 유형은 IDENTITY 로 설정할 수 없으므로 생성 된 마이그레이션에서 주석을 찾을 수 없습니다. 값을 지정하지 않고 레코드를 추가하려고하면 데이터베이스에서 값을 생성합니다. 속성 Id 명시 적으로 값을 설정하면 EF7은 해당 값을 사용하여 데이터베이스에 전파합니다. 이것은 주석의 예상되는 효과입니다.




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