2016-12-15 1 views
1

Heute hatte ich, und möglicherweise noch mehr Probleme mit EF6 integrierten Konventionen. Beim Debugging habe ich gesehen, dass der Code zuerst EF6 alle verfügbaren Standardkonventionen aktiviert.Deaktivieren Sie alle Konventionen in EF6

Da ich eine gut aussehende Modellzuordnung mit Mapper-Klassen erstellt habe, möchte ich nicht, dass Konventionen mein Datenmodell ändern.

In dem speziellen, kann ich nicht eine einfache SELECT Abfrage wegen einer falschen Spalte Extent1.LinkedEntity_id ausführen, die in die SQL werden, wenn die FK Spalte korrekt als linkedentity abgebildet ist, und ich habe keinen Grund, einen anderen Namen zu verwenden, in meinem Datenbank.

Zur Klarheit: Dieses Code-First-Modell ist Reverse Engineering von einem DB-zuerst. Datenbankregeln und ich kann sein Design nicht ändern.

Frage: Wie deaktiviere ich alle Konventionen auf einmal? Scheint, dass ich keine .Clear Methode in

+0

Warum verwenden Sie Code-zuerst, wenn der DB existiert und nicht geändert werden kann? Das sieht für mich zunächst nach Datenbank-Datenbank aus. – Sefe

+0

Es ist eine lange Geschichte. Grundsätzlich pflegen wir ein ** Produkt **, kein Projekt. Es gibt keinen einzelnen DB: Die Datenbank muss an jedem Kundenstandort, auf dem die Anwendung installiert ist, bereitgestellt, verwaltet und migriert werden. Wirklich, es ist eine lange Geschichte, die mit einem Bulk-Insert-Fehler mit zwei verschiedenen EF-Utility-Bibliotheken begann. –

+0

In der Tat, ich hatte dieses Problem nicht, bevor ich das EDMX-Modell zu Code zuerst portierte –

Antwort

1

Methode finden kann Es gibt keine native Möglichkeit, sie zu entfernen. Aber es könnte möglich sein, Reflektionen zu verwenden. Finden Sie alle Konventionen und rufen Sie dann Remove auf ihnen. So etwas sollte helfen:

private void RemoveAllConventions(DbModelBuilder modelBuilder) 
    { 

     var conventions = AppDomain.CurrentDomain.GetAssemblies() 
      .SelectMany(a => a.GetTypes().Where(t => t.IsClass && t.GetInterface("IConvention") != null)); 


     var remove = typeof(ConventionsConfiguration).GetMethods().Where(m => m.Name == "Remove" && m.ContainsGenericParameters).First(); 
     foreach (var item in conventions) 
     { 
      try 
      { 
       remove.MakeGenericMethod(item).Invoke(modelBuilder.Conventions, null); 
      } 
      catch (Exception) 
      { 
      } 
     } 
    } 

Und dann in Ihrem OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     RemoveAllConventions(modelBuilder); 
    } 

frei Fühlen Sie sich mehr auf dieses Konzept zu wiederholen und Ihre Ergebnisse zu berichten.

+0

Hallo, das war die richtige Lösung für meine Frage (obwohl ich ein wenig zwicken musste), aber aus Gründen der Diskussion hat es mein Grundproblem nicht gelöst. Ich hoffe, irgendwann auf EF7 upgraden zu können, aber das bedeutet eine Neufassung –

Verwandte Themen