답변:
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; }
"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
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에서는 열 주석을 사용할 수 없습니다.
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");
Key
받는 사람 속성 UserName
특성은 원인이됩니다 UserName
속성은 데이터베이스의 기본 키가 될 수 있습니다. UserId
속성 만 속성으로 표시해야 Key
합니다. 이 솔루션은 잘못된 데이터베이스 디자인을 제공하면서 프로그래밍 측면에서 '올바른'동작을 제공합니다.