Varlık içinde Kısıtlama benzersiz Çerçeve Kod İlk
Soru
Bir özelliği de akıcı sözdizimi veya bir öznitelik kullanarak benzersiz bir kısıtlama tanımlamak mümkün mü? Geçici çözümler, ne değildir?
Birincil anahtar ile kullanıcı Dersim var, ama e-posta adresini de benzersiz olduğundan emin olmak istiyorum. Mümkün doğrudan veritabanı düzenleme olmadan bu?
Çözüm (Matt cevabı dayalı)
public class MyContext : DbContext {
public DbSet<User> Users { get; set; }
public override int SaveChanges() {
foreach (var item in ChangeTracker.Entries<IModel>())
item.Entity.Modified = DateTime.Now;
return base.SaveChanges();
}
public class Initializer : IDatabaseInitializer<MyContext> {
public void InitializeDatabase(MyContext context) {
if (context.Database.Exists() && !context.Database.CompatibleWithModel(false))
context.Database.Delete();
if (!context.Database.Exists()) {
context.Database.Create();
context.Database.ExecuteSqlCommand("alter table Users add constraint UniqueUserEmail unique (Email)");
}
}
}
}
CEVAP
Söyleyebileceğim kadarıyla, şu anda Varlık Çerçevesi ile bunu yapmanın yolu yok. Ancak, bu sadece benzersiz kısıtlamaları ile ilgili bir sorun değil... dizinler, check kısıtlamaları oluşturmak isteyebilirsiniz, ve muhtemelen tetikler ve diğer yapıları, çok. Senin ile Here's a simple pattern you can use kuşkusuz veritabanı agnostik olmasa da-ilk kod kurulumu:
public class MyRepository : DbContext {
public DbSet<Whatever> Whatevers { get; set; }
public class Initializer : IDatabaseInitializer<MyRepository> {
public void InitializeDatabase(MyRepository context) {
if (!context.Database.Exists() || !context.Database.ModelMatchesDatabase()) {
context.Database.DeleteIfExists();
context.Database.Create();
context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT...");
context.ObjectContext.ExecuteStoreCommand("CREATE INDEX...");
context.ObjectContext.ExecuteStoreCommand("ETC...");
}
}
}
}
Başka bir seçenek varsa, etki alanı modeli güncelleme veri veritabanında, teklik şartı kendiniz uygulamak ve veritabanı bırakabilirsin ekleme/tek yöntemdir. Bu daha taşınabilir bir çözümdür ve kodunuzda iş kuralları iyice zorlar, ama veritabanı geçersiz veri geri bacalı almak için açık bırakır.
Akıcı API ile benzersiz Kısıtlama Ayar...
Varlık Çerçevesi içinde birden çok süt...
Varlık içinde Operatör gibi Çerçeve?...
Nasıl Varlık içinde Saklı Yordamını ça...
Varlık çerçevesi içinde geliştirmek bu...