Saya mencoba membangun Entitas EF dengan Code First, dan EntityTypeConfigurationmenggunakan API yang lancar. membuat kunci utama itu mudah tetapi tidak demikian dengan Batasan Unik. Saya melihat posting lama yang menyarankan untuk mengeksekusi perintah SQL asli untuk ini, tapi itu tampaknya mengalahkan tujuannya. apakah ini mungkin dengan EF6?
Ini adalah contoh yang lebih realistis. Itu menambahkan indeks unik pada banyak properti: User.FirstNamedan User.LastName, dengan nama indeks "IX_FirstNameLastName"
Ini diperlukan untuk memberi nama anotasi kolom sebagai "Indeks"! Saya menulis nama lain dan itu tidak berhasil! Saya menghabiskan berjam-jam sebelum saya mencoba mengubah namanya menjadi "Indeks" asli seperti pada posting Anda dan memahami bahwa ini penting. :( Harus ada konstanta untuk itu dalam rangka untuk tidak menyulitkan kode string.
@Nathan Terima kasih! Itu dia! Contoh dalam posting ini harus diperbaiki menggunakan konstanta ini.
Alexander Vasilyev
2
Tampaknya tidak dapat menemukannya di EF7 - DNX
Shimmy Weitzhandler
2
Saya percaya bahwa IsUnique perlu disetel ke true ketika membuat IndexAttribute pada contoh pertama. Seperti ini: new IndexAttribute() { IsUnique = true }. Jika tidak, ia hanya akan membuat indeks biasa (tidak unik).
jakubka
134
Sebagai tambahan untuk jawaban Yorro, itu juga bisa dilakukan dengan menggunakan atribut.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
namespace EFIndexTest{classProgram{staticvoidMain(string[] args){
using (var context =newAppDbContext()){var newUser =newUser{UniqueKeyIntPart1=1,UniqueKeyIntPart2=1,UniqueKeyStringPart1="A",UniqueKeyStringPart2="A"};
context.UserSet.Add(newUser);
context.SaveChanges();}}}[MetadataType(typeof(UserMetadata))]publicclassUser{publicintId{get;set;}publicintUniqueKeyIntPart1{get;set;}publicintUniqueKeyIntPart2{get;set;}publicstringUniqueKeyStringPart1{get;set;}publicstringUniqueKeyStringPart2{get;set;}}publicclassUserMetadata{[Index("IX_UniqueKeyInt",IsUnique=true,Order=1)]publicintUniqueKeyIntPart1{get;set;}[Index("IX_UniqueKeyInt",IsUnique=true,Order=2)]publicintUniqueKeyIntPart2{get;set;}[Index("IX_UniqueKeyString",IsUnique=true,Order=1)][MaxLength(50)]publicstringUniqueKeyStringPart1{get;set;}[Index("IX_UniqueKeyString",IsUnique=true,Order=2)][MaxLength(50)]publicstringUniqueKeyStringPart2{get;set;}}publicclassAppDbContext:DbContext{publicvirtualDbSet<User>UserSet{get;set;}}}
Tidak jika Anda ingin menjaga model domain Anda sepenuhnya terpisah dari masalah penyimpanan.
Rickard Liljeberg
4
Anda juga perlu memastikan Anda memiliki referensi ke EntityFramework
Michael Tranchida
2
Bersikaplah baik jika atribut Indeks dipisahkan dari Kerangka Entitas sehingga saya dapat memasukkannya dalam proyek Model saya. Saya mengerti bahwa ini adalah masalah penyimpanan, tetapi alasan utama saya menggunakannya adalah untuk menempatkan batasan unik pada hal-hal seperti Nama Pengguna dan Nama Peran.
Sam
2
Tampaknya tidak dapat menemukannya di EF7 - DNX
Shimmy Weitzhandler
4
Ini hanya berfungsi jika Anda juga membatasi panjang string, karena SQL tidak mengizinkan nvarchar (maks) digunakan sebagai kunci.
JMK
17
Berikut adalah metode ekstensi untuk mengatur indeks unik lebih lancar:
@ coni2k jawaban benar tetapi Anda harus menambahkan [StringLength]atribut agar berfungsi jika tidak Anda akan mendapatkan pengecualian kunci yang tidak valid (Contoh di bawah).
IndexAnnotation.AnnotationName
new IndexAttribute() { IsUnique = true }
. Jika tidak, ia hanya akan membuat indeks biasa (tidak unik).Sebagai tambahan untuk jawaban Yorro, itu juga bisa dilakukan dengan menggunakan atribut.
Sampel untuk
int
jenis kombinasi tombol unik:Jika tipe data adalah
string
, makaMaxLength
atribut harus ditambahkan:Jika ada masalah pemisahan model domain / penyimpanan, menggunakan
Metadatatype
atribut / kelas dapat menjadi pilihan: https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx?f= 255 & MSPPError = -2147217396Contoh aplikasi konsol cepat:
sumber
Berikut adalah metode ekstensi untuk mengatur indeks unik lebih lancar:
Pemakaian:
Akan menghasilkan migrasi seperti:
Src: Membuat Indeks Unik dengan Kerangka Entitas 6.1 API lancar
sumber
@ coni2k jawaban benar tetapi Anda harus menambahkan
[StringLength]
atribut agar berfungsi jika tidak Anda akan mendapatkan pengecualian kunci yang tidak valid (Contoh di bawah).sumber
Sayangnya ini tidak didukung di Entity Framework. Itu ada di peta jalan untuk EF 6, tapi itu didorong kembali: Workitem 299: Kendala Unik (Indeks Unik)
sumber
sumber