2017-06-07 1 views
0

Ist es möglich, die Klasse (Entity) Namen in automatisch generierten CS-Dateien im EDMX-Modell umzubenennen? Ich brauche Großbuchstaben für alle Entitäten, z.B. "account" muss in "Account" geändert werden.Stapel Umbenennen von Klassen in Entity Framework Database First

partial class account 
    { 
     public long id { get; set; } 
     public int idPartner { get; set; } 
     public string accountName { get; set; } 
    } 

Visual Studio wurde Erzeugung kleingeschrieben Namen für MySql Tabellen im Projekt verwendet, die in der Produktion eingesetzt wurde & die Tabellennamen nicht geändert werden kann. Ich weiß, dass Mappings können geändert werden mit Eigenschaftsfenster in EDMX-Designer, aber es ist in diesem Fall nicht nützlich, weil so viele Tabellen. Gibt es ein Werkzeug, das das kann? Wenn es keine gibt, was sind die genauen Schritte, um die edmx & andere Dateien zu ändern, so dass ich ein Werkzeug für die Batch-Änderung aller Entitäten erstellen kann?

Antwort

0

Ich bin nicht sicher, ob Entity Framework 6 die Situation gegenüber EF 5 verbessert hat. Ich hatte ein ähnliches Problem mit EF 5 und habe eine Lösung gefunden, mit der ich das VS-generierte EDMX erfolgreich transformieren konnte. Im Grunde ist es eine Konsolen-App, die eine EDMX-Datei aufnimmt und transformiert.

Ich habe das Tool lediglich (erfolgreich) benutzt. Sie finden das Original mit Noten finden Sie hier: https://www.tabsoverspaces.com/233202-changing-entity-names-i-e-removing-prefix-in-entity-frameworks-edmx-in-batch/

Credit Jiří Cincura (www.tabsoverspaces.com)

Im Folgenden ist der Code:

static void TransformEDMXEntities(string inputFile, string outputFile) 
{ 
    XDocument xdoc = XDocument.Load(inputFile); 

    const string CSDLNamespace = "http://schemas.microsoft.com/ado/2009/11/edm"; 
    const string MSLNamespace = "http://schemas.microsoft.com/ado/2009/11/mapping/cs"; 
    const string DesignerNamespace = "http://schemas.microsoft.com/ado/2009/11/edmx"; 
    XElement csdl = xdoc.Descendants(XName.Get("Schema", CSDLNamespace)).First(); 
    XElement msl = xdoc.Descendants(XName.Get("Mapping", MSLNamespace)).First(); 
    XElement designerDiagram = xdoc.Descendants(XName.Get("Designer", DesignerNamespace)).First(); 

    Func<string, string> transformation = (string input) => 
    { 
     const string PREFIX = "tbl"; 
     Regex re = new Regex(string.Format(@"{0}(\w+)", Regex.Escape(PREFIX)), RegexOptions.None); 
     return re.Replace(input, new MatchEvaluator(
      (Match m) => 
      { 
       return m.Groups[1].Value; 
      })); 
    }; 

    TransformCSDL(CSDLNamespace, csdl, transformation); 
    TransformMSL(MSLNamespace, msl, transformation); 
    TransformDesigner(DesignerNamespace, designerDiagram, transformation); 

    using (XmlTextWriter writer = new XmlTextWriter(outputFile, Encoding.Default)) 
    { 
     xdoc.WriteTo(writer); 
    } 
} 

static void TransformDesigner(string DesignerNamespace, XElement designerDiagram, Func<string, string> transformation) 
{ 
    foreach (var item in designerDiagram.Elements(XName.Get("EntityTypeShape", DesignerNamespace))) 
    { 
     item.Attribute("EntityType").Value = transformation(item.Attribute("EntityType").Value); 
    } 
} 

static void TransformMSL(string MSLNamespace, XElement msl, Func<string, string> transformation) 
{ 
    foreach (var entitySetMapping in msl.Element(XName.Get("EntityContainerMapping", MSLNamespace)).Elements(XName.Get("EntitySetMapping", MSLNamespace))) 
    { 
     entitySetMapping.Attribute("Name").Value = transformation(entitySetMapping.Attribute("Name").Value); 
     foreach (var entityTypeMapping in entitySetMapping.Elements(XName.Get("EntityTypeMapping", MSLNamespace))) 
     { 
      entityTypeMapping.Attribute("TypeName").Value = transformation(entityTypeMapping.Attribute("TypeName").Value); 
     } 
    } 
} 

static void TransformCSDL(string CSDLNamespace, XElement csdl, Func<string, string> transformation) 
{ 
    foreach (var entitySet in csdl.Element(XName.Get("EntityContainer", CSDLNamespace)).Elements(XName.Get("EntitySet", CSDLNamespace))) 
    { 
     entitySet.Attribute("Name").Value = transformation(entitySet.Attribute("Name").Value); 
     entitySet.Attribute("EntityType").Value = transformation(entitySet.Attribute("EntityType").Value); 
    } 
    foreach (var associationSet in csdl.Element(XName.Get("EntityContainer", CSDLNamespace)).Elements(XName.Get("AssociationSet", CSDLNamespace))) 
    { 
     foreach (var end in associationSet.Elements(XName.Get("End", CSDLNamespace))) 
     { 
      end.Attribute("EntitySet").Value = transformation(end.Attribute("EntitySet").Value); 
     } 
    } 

    foreach (var entityType in csdl.Elements(XName.Get("EntityType", CSDLNamespace))) 
    { 
     entityType.Attribute("Name").Value = transformation(entityType.Attribute("Name").Value); 
    } 
    foreach (var association in csdl.Elements(XName.Get("Association", CSDLNamespace))) 
    { 
     foreach (var end in association.Elements(XName.Get("End", CSDLNamespace))) 
     { 
      end.Attribute("Type").Value = transformation(end.Attribute("Type").Value); 
     } 
    } 
} 
+0

es sieht vielversprechend aus. Ich werde es als Antwort prüfen und markieren, wenn es funktioniert. Danke trotzdem. –

+0

Versucht mit 2 Tabellen und bekommen folgende Fehler, können Sie helfen? 1. Das EntityType Model.Account, das als Teil dieser MSL angegeben wurde, existiert nicht in MetadataWorkspace 2. Mindestens eine Eigenschaft muss im Set-Mapping für "Accounts" zugeordnet werden –

+0

Entschuldigung, aber ich habe keine Zeit bei der Moment um dies zu beweisen. Ich kann mich nicht erinnern, dieses Problem zu lösen, als ich dies vor 5 Monaten mit EF gemacht habe. – STLDeveloper

Verwandte Themen