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

  • DJPixcell

    DJPixcell

    20 NİSAN 2007
  • george sarintzotis

    george sarin

    2 Aralık 2007
  • LardTardProductions's channel

    LardTardProd

    10 NİSAN 2009