Entity Framework 코드 첫 번째 고유 열


114

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

나는 수업이있다

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

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

답변:


257

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

23
관련 현재 정보와 함께이 사람의 이전 게시물에 답장 해 주셔서 감사합니다!
Jim Yarbro 2007

3
왜 인덱스가 아닌가?
John Henckel 2015 년

2
contraint 질문 ... MSDN 대 인덱스에 대답하려면 : "There are no significant differences between creating a UNIQUE constraint and creating a unique index that is independent of a constraint. Data validation occurs in the same manner, and the query optimizer does not differentiate between a unique index created by a constraint or manually created. However, creating a UNIQUE constraint on the column makes the objective of the index clear." msdn.microsoft.com/en-us/library/ms187019.aspx
user919426

3
노트; 엔티티 프레임 워크 코어 1.0.0 - preview2 - 결승전 데이터 주석 방법을 사용할 수 없습니다 - docs.efproject.net/en/latest/modeling/...
에드워드 꼬모

26

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


1
그것이 바로 제가 찾던 것입니다! 마이그레이션을 사용하여 이러한 제약을 추가 할 수 있는지 궁금합니다.
Alex Jorgenson

@Ladislav Mrnka : Seed 메서드를 통해서도 가능합니까?
Raheel 칸

2
예를 들어 주시겠습니까? 감사!
Zero3

10

코드에서 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에서는 열 주석을 사용할 수 없습니다.


구성을 사용하여 여러 열로 인덱스를 만드는 것은 어떻습니까?
FindOutIslamNow 2010 년

하나는 UserName에 있고 다른 하나는 무엇입니까?
알렉산더 크리스토프

5

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


2

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

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

-13

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");

25
이 솔루션에주의하십시오. 추가 중 Key받는 사람 속성 UserName특성은 원인이됩니다 UserName속성은 데이터베이스의 기본 키가 될 수 있습니다. UserId속성 만 속성으로 표시해야 Key합니다. 이 솔루션은 잘못된 데이터베이스 디자인을 제공하면서 프로그래밍 측면에서 '올바른'동작을 제공합니다.
Alex Jorgenson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.