EF5 Code First: Détecte si une firebase database est créée pour pouvoir exécuter les instructions ALTER

Je suis nouveau dans Entity Framework 5. Notre équipe utilise le stream de travail Code First .

Avant de commencer par ma question principale, laissez-moi d’abord vous montrer ce que j’ai essayé ( le commentaire ultime de tous les temps :D ) .

 public class MyDBContext : CDBContext { public MyDBContext() : base(connSsortingng) { } public MyDBContext(ssortingng connStr) : base(connStr) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // removes some conventions modelBuilder.Conventions.Remove(); // ........ // model configurations which contains mappings modelBuilder.Configurations.Add(new AccountConfiguration()); // ........ // calls base OnModelCreating base.OnModelCreating(modelBuilder); } // list of all Entity public DbSet Account { get; set; } } 

MyDBContext est la classe que j’ai créée et qui hérite de DBContext . CBDContext contient des méthodes de remplacement et hérite également de DBContext . L’un des problèmes que j’ai rencontré est que le framework d’entités ne gère pas l’unicité des champs. J’ai déjà lu l’article sur la configuration / mappage des propriétés et des types avec l’API Fluent sur leur site et je ne trouve aucune configuration permettant de définir une propriété comme unique.

Ce que j’ai fait pour définir le champ unique est d’exécuter manuellement plusieurs instructions ALTER SQL lors de la création,

 using (MyDBContext _context = new MyDBContext(connSsortingng)) { if (_context.Database.CreateIfNotExists()) { _context.Database.ExecuteSqlCommand("ALTER TABLE Account ADD CONSTRAINT UQ_Account_AccountNumber UNIQUE(AccountNumber)"); _context.Database.ExecuteSqlCommand("ALTER TABLE Account ADD CONSTRAINT UQ_Account_GUID UNIQUE(GUID)"); // .... more on this in the following lines ... } } 

Mes questions:

  1. Ai-je raison de dire que la structure de l’entité n’a pas de configuration ni d’annotations de données pour définir le champ comme unique ?
  2. Existe-t-il un moyen de détecter ou de savoir, au cours de l’exécution, si EF crée une firebase database ou non, pour que je puisse déplacer ou masquer cette instruction if (_context.Database.CreateIfNotExists()) quelque part vers une méthode disponible pouvant être remplacée?

Ce que je veux vraiment, c’est de supprimer if (_context.Database.CreateIfNotExists()) de la commande using et de le placer ailleurs ou dans MyDBContext afin que mon code ressemble à ceci,

 using (MyDBContext _context = new MyDBContext(connSsortingng)) { Account _acc = new Account() // ...Account properties ... _context.Account.Add(_acc); _context.SaveChanges(); } 

Merci.

Si vous n’utilisez pas (ou ne pouvez pas utiliser) les migrations EF, vous pouvez utiliser un initialiseur personnalisé comme indiqué dans cette réponse . L’initialiseur personnalisé exécutera une méthode Seed après avoir créé la firebase database = une seule fois lorsque la firebase database n’existe pas. Si vous avez besoin de développer de manière incrémentielle l’initialiseur de firebase database lui-même ne vous aidera pas (c’est à cela que servent les migrations).

Vous devriez jeter un coup d’œil à Code First Migrations , plus spécifique dans les sections Data Motion / Custom SQL et ultérieures – c’est peut-être le moyen d’obtenir le résultat souhaité. Votre classe de migration peut ressembler à ceci:

 public partial class AddUniqueConstrains : DbMigration { public override void Up() { Sql("ALTER TABLE Account ADD CONSTRAINT UQ_Account_AccountNumber UNIQUE(AccountNumber)"); Sql("ALTER TABLE Account ADD CONSTRAINT UQ_Account_GUID UNIQUE(GUID)"); } public override void Down() { Sql("ALTER TABLE Account DROP CONSTRAINT UQ_Account_AccountNumber UNIQUE"); Sql("ALTER TABLE Account DROP CONSTRAINT UQ_Account_GUID"); } } 

Vous pouvez également explorer d’autres options décrites dans les réponses à cette question: Contrainte unique dans Entity Framework Code First