2013-09-28 6 views
5

Wie kann ich die Namenskonvention der automatisch generierten Viele-zu-Viele-Tabelle ändern?Wie ändere ich die Namenskonvention von Viele-zu-Viele-Tabellenbeziehungen?

Angenommen ich zwei Klassen:

public class User 
{ 
    public int UserId { get; set; } 
    public virtual List<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public virtual List<User> Users { get; set; } 
} 

Standardmäßig wird dies eine Tabelle Userroles genannt erstellen.

ich den Namen dieser ein Tabelle zum Beispiel, zu UsersInRoles ändern können, indem Sie das folgende in der OnModelCreating außer Kraft setzen meine DbContext mit:

modelBuilder.Entity<User>() 
    .HasMany(p => p.Roles) 
    .WithMany(p => p.Users) 
    .Map(mc => 
    { 
     mc.MapLeftKey("UserId"); 
     mc.MapRightKey("RoleId"); 
     mc.ToTable("UsersInRoles"); 
    }); 

Aber was ich wirklich tun möchte Ändern Sie die Namenskonvention so, dass standardmäßig alle automatisch generierten Viele-zu-Viele-Tabellen diese neue Konvention verwenden. Ich kann nicht herausfinden, wie das geht oder ob es überhaupt möglich ist. Ich möchte nicht jedesmal, wenn ich eine dieser Beziehungen spezifiziere, 9 Zeilen zusätzlichen Code spezifizieren.

Ich verwende derzeit EF Version 6.0.0-rc1.

+0

Aus Neugier, warum willst du das wirklich machen? Die Kodierung nach Konvention verliert ihren ganzen Charme, wenn Sie immer wieder andere haben. –

+0

Sie können sich [Custom Conventions] (http://msdn.microsoft.com/en-us/data/jj819164.aspx) ansehen. –

+0

@TonyHopkinson, In meinem realen Szenario, ich schreibe ein Framework, das alle Tabellennamen mit einem Präfix basierend auf ihrer "Komponente" Speicherort (wie Core, HR, Finanzen, etc.) ändert. Während ich in der Lage war, einen Catch-All für die Umbenennung von Standardtabellen zu schreiben, funktionierte es nicht mit diesen Viele-zu-Viele-Tabellen, und ich kann nicht herausfinden, wie. Was mein Beispiel betrifft, ich habe diese Konvention schon lange benutzt und würde gerne dabei bleiben. –

Antwort

5

Die Fähigkeit, Beziehungen zu steuern, wurde vor der Veröffentlichung aus der grundlegenden Konventionen API entfernt, da es nicht in einem verwendbaren Zustand war. Sie können auf alle Eigenschaften und Tabellen im Modell über modellbasierte Konventionen zugreifen. Eine Übersicht über modellbasierte Konventionen finden Sie hier: http://msdn.microsoft.com/en-US/data/dn469439

Diese Lösung ein wenig beinhaltet mehr Graben um in den Metadaten-API, EntitySet ist der richtige Typ für dieses Szenario

Diese Konvention sollte die erzeugte Beziehungstabelle umbenennen:

public class MyConvention : IStoreModelConvention<EntitySet> 
{ 
    public void Apply(EntitySet set, DbModel model) 
    { 
     var properties = set.ElementType.Properties; 
     if (properties.Count == 2) 
     { 
      var relationEnds = new List<string>(); 
      int i = 0; 
      foreach (var metadataProperty in properties) 
      { 
       if (metadataProperty.Name.EndsWith("_ID")) 
       { 
        var name = metadataProperty.Name; 
        relationEnds.Add(name.Substring(0, name.Length - 3)); 
        i++; 
       } 
      } 
      if (relationEnds.Count == 2) 
      { 
       set.Table = relationEnds.ElementAt(0) + "_" + relationEnds.ElementAt(1) + "_RelationTable"; 
      } 
     } 
    } 
+0

Ich spielte mit diesem etwas herum, aber fand heraus, dass die EntityType-Konvention es mir nicht erlaubt, Tabellen umzubenennen. Die Eigenschaft Name festlegen ist intern. Also bin ich wieder dabei, jede Tabelle manuell umbenennen zu müssen. –

+0

Löst die obige Konvention Ihr Problem oder gibt es noch etwas, das Sie brauchen? – lukew

+0

Nein, das ist perfekt! Ich kann nicht sagen, dass ich den EDM-Teil fast genauso gut kenne wie ich sollte, aber das funktioniert großartig. Vielen Dank! –

Verwandte Themen