[entity-framework] Entity Framework 코드 첫 번째 고유 열

Entity Framework 4.3을 사용하고 Code Fist를 사용하고 있습니다.

나는 수업이있다

public class User
{
   public int UserId{get;set;}
   public string UserName{get;set;}
}

데이터베이스 테이블을 만들 때 UserName이 고유해야한다고 Entity Framework에 어떻게 알립니 까? 가능한 경우 구성 파일 대신 데이터 주석을 사용하는 것을 선호합니다.



답변

Entity Framework 6.1 이상에서는 모델에이 특성을 사용할 수 있습니다.

[Index(IsUnique=true)]

다음 네임 스페이스에서 찾을 수 있습니다.

using System.ComponentModel.DataAnnotations.Schema;

모델 필드가 문자열 인 경우 SQL Server에서 nvarchar (MAX)로 설정되어 있지 않은지 확인하십시오. 그렇지 않으면 Entity Framework Code First에서이 오류가 표시됩니다.

‘dbo.y’테이블의 ‘x’열이 인덱스의 키 열로 사용하기에 잘못된 유형입니다.

그 이유는 다음과 같습니다.

SQL Server는 모든 인덱스 키 열의 최대 총 크기에 대해 900 바이트 제한을 유지합니다. “

( 출처 : http://msdn.microsoft.com/en-us/library/ms191241.aspx )

모델에 최대 문자열 길이를 설정하여이 문제를 해결할 수 있습니다.

[StringLength(450)]

이제 EF CF 6.1+에서 모델이 다음과 같이 표시됩니다.

public class User
{
   public int UserId{get;set;}
   [StringLength(450)]
   [Index(IsUnique=true)]
   public string UserName{get;set;}
}

최신 정보:

Fluent를 사용하는 경우 :

  public class UserMap : EntityTypeConfiguration<User>
  {
    public UserMap()
    {
      // ....
      Property(x => x.Name).IsRequired().HasMaxLength(450).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } }));
    }
  }

modelBuilder에서 사용하십시오.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  // ...
  modelBuilder.Configurations.Add(new UserMap());
  // ...
}

업데이트 2

EntityFrameworkCore의 경우 https://github.com/aspnet/EntityFrameworkCore/issues/1698 항목도 참조하십시오.

업데이트 3

EF6.2의 경우 https://github.com/aspnet/EntityFramework6/issues/274를 참조하십시오.

업데이트 4

ASP.NET Core Mvc 2.2 (EF Core 포함) :

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }


답변

EF는 키를 제외한 고유 한 열을 지원하지 않습니다. EF 마이그레이션을 사용하는 경우 EF가 UserName열에 고유 인덱스를 만들도록 강제 할 수 있지만 (어노테이션이 아닌 마이그레이션 코드에서) 고유성은 데이터베이스에서만 적용됩니다. 중복 값을 저장하려고하면 데이터베이스에 의해 발생한 예외 (제약 조건 위반)를 포착해야합니다.


답변

코드에서 POCO를 사용하는 것이 분명해집니다. 다른 키가 필요하지 않습니다 . juFo가 제안한대로 색인을 추가 할 수 있습니다 .
UserName 속성을 지정하는 대신 Fluent API를 사용하는 경우 열 주석은 다음과 같아야합니다.

this.Property(p => p.UserName)
    .HasColumnAnnotation("Index", new IndexAnnotation(new[] {
        new IndexAttribute("Index") { IsUnique = true }
    }
));

그러면 다음 SQL 스크립트가 생성됩니다.

CREATE UNIQUE NONCLUSTERED INDEX [Index] ON [dbo].[Users]
(
    [UserName] ASC
)
WITH (
    PAD_INDEX = OFF,
    STATISTICS_NORECOMPUTE = OFF,
    SORT_IN_TEMPDB = OFF,
    IGNORE_DUP_KEY = OFF,
    DROP_EXISTING = OFF,
    ONLINE = OFF,
    ALLOW_ROW_LOCKS = ON,
    ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]

동일한 UserName을 가진 여러 사용자를 삽입하려고하면 다음 메시지와 함께 DbUpdateException이 발생합니다.

Cannot insert duplicate key row in object 'dbo.Users' with unique index 'Index'.
The duplicate key value is (...).
The statement has been terminated.

다시 말하지만 버전 6.1 이전의 Entity Framework에서는 열 주석을 사용할 수 없습니다.


답변

Entity Framework 6.1 (현재 베타 버전)에서는 IndexAttribute를 지원하여 Code First 마이그레이션에서 (고유 한) 인덱스가 자동으로 생성되는 인덱스 속성에 주석을 추가합니다.


답변

FluentAPI를 사용하는 EF 6.2 에서는 다음을 사용할 수 있습니다.HasIndex()

modelBuilder.Entity<User>().HasIndex(u => u.UserName).IsUnique();


답변

EF4.3 용 솔루션

고유 한 사용자 이름

다음과 같이 열에 데이터 주석을 추가합니다.

 [Index(IsUnique = true)]
 [MaxLength(255)] // for code-first implementations
 public string UserName{get;set;}

고유 ID
, 내 칼럼 위에 장식 [키]를 추가하고 완료했습니다. 여기에 설명 된 것과 동일한 솔루션 : https://msdn.microsoft.com/en-gb/data/jj591583.aspx

IE :

[Key]
public int UserId{get;set;}

대체 답변

데이터 주석 사용

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("UserId")]

매핑 사용

  mb.Entity<User>()
            .HasKey(i => i.UserId);
        mb.User<User>()
          .Property(i => i.UserId)
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
          .HasColumnName("UserId");


답변