Dalam Entity Framework 6.1+, Anda dapat menggunakan atribut ini pada model Anda:
[Index(IsUnique=true)]
Anda dapat menemukannya di namespace ini:
using System.ComponentModel.DataAnnotations.Schema;
Jika bidang model Anda adalah string, pastikan tidak disetel ke nvarchar (MAX) di SQL Server atau Anda akan melihat kesalahan ini dengan Kode Kerangka Kerja Entitas Pertama:
Kolom 'x' dalam tabel 'dbo.y' adalah jenis yang tidak valid untuk digunakan sebagai kolom kunci dalam indeks.
Alasannya karena ini:
SQL Server mempertahankan batas 900 byte untuk ukuran total maksimum dari semua kolom kunci indeks. "
(dari: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Anda dapat menyelesaikannya dengan menyetel panjang string maksimum pada model Anda:
[StringLength(450)]
Model Anda akan terlihat seperti ini sekarang di EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Memperbarui:
jika Anda menggunakan Fasih:
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
// ....
Property(x => x.Name).IsRequired().HasMaxLength(450).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } }));
}
}
dan gunakan di modelBuilder Anda:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Perbarui 2
untuk EntityFrameworkCore, lihat juga topik ini: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Perbarui 3
untuk EF6.2 lihat: https://github.com/aspnet/EntityFramework6/issues/274
Perbarui 4
ASP.NET Core Mvc 2.2 dengan 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.aspxEF tidak mendukung kolom unik kecuali kunci. Jika Anda menggunakan Migrasi EF, Anda dapat memaksa EF untuk membuat indeks unik pada
UserName
kolom (dalam kode migrasi, bukan dengan anotasi apa pun) tetapi keunikan tersebut hanya akan diberlakukan di database. Jika Anda mencoba untuk menyimpan nilai duplikat, Anda harus menangkap pengecualian (pelanggaran batasan) yang dipicu oleh database.sumber
Dari kode Anda, terlihat jelas bahwa Anda menggunakan POCO. Tidak perlu memiliki kunci lain: Anda dapat menambahkan indeks seperti yang disarankan oleh juFo .
Jika Anda menggunakan Fluent API alih-alih mengaitkan properti UserName, anotasi kolom Anda akan terlihat seperti ini:
Ini akan membuat skrip SQL berikut:
Jika Anda mencoba memasukkan beberapa Pengguna yang memiliki NamaPengguna yang sama, Anda akan mendapatkan DbUpdateException dengan pesan berikut:
Sekali lagi, penjelasan kolom tidak tersedia di Entity Framework sebelum versi 6.1.
sumber
Perhatikan bahwa di Entity Framework 6.1 (saat ini dalam versi beta) akan mendukung IndexAttribute untuk menganotasi properti indeks yang secara otomatis akan menghasilkan indeks (unik) di Migrasi Pertama Kode Anda.
sumber
Di EF 6.2 menggunakan FluentAPI , Anda dapat menggunakan
HasIndex()
sumber
Solusi untuk EF4.3
UserName Unik
Tambahkan anotasi data di atas kolom sebagai:
ID Unik , saya telah menambahkan dekorasi [Key] di atas kolom saya dan selesai. Solusi yang sama seperti yang dijelaskan di sini: https://msdn.microsoft.com/en-gb/data/jj591583.aspx
YAITU:
Jawaban alternatif
menggunakan anotasi data
menggunakan pemetaan
sumber
Key
atribut keUserName
properti akan menyebabkanUserName
properti menjadi kunci utama dalam database. HanyaUserId
properti yang harus ditandai denganKey
atribut. Solusi ini akan memberi Anda perilaku 'benar' di sisi pemrograman sambil memberi Anda desain database yang salah.