SORU
10 Aralık 2010, Cuma


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
13 Aralık 2010, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • MrExcite96

    MrExcite96

    17 ŞUBAT 2011
  • sinumatic

    sinumatic

    19 Aralık 2006