2013-03-22 4 views
5

Ich habe eine Oracle-Datenbank, die Spalten mit den Namen in der folgenden Art und Weise hat: CREATED_BY, EMPLOYEE_FIRST_NAME,Wie kann ich alle Entity Framework-Klassen mit Pascal Case-Notation auf Eigenschaften generieren?

Wenn mein Entity Framework-Klassen generiert werden, ich möchte den zugehörigen Eigenschaften der Spalte wie folgt aussehen: CreatedBy, EmployeeFirstName, etc ...

Gibt es eine Möglichkeit, dies zu tun, ohne jede Eigenschaft manuell bearbeiten zu müssen?

+1

ich ReSharper wissen kann die FOO_BAR_BAZ Konvention sowie Camelcase erkennen und zu analysieren. Ich habe nie versucht, re # er zu verwenden, um diese Art der Code-Umwandlung für mehrere Dateien gleichzeitig zu skandieren, aber es ist großartig, einen Bezeichner nach dem anderen zu ändern, und es ist großartig, sie zu finden. Du könntest dort anfangen. –

Antwort

2

Es könnte tatsächlich nicht über C# -Code überhaupt sein. Wenn Sie Oracle verwenden, gehe ich davon aus, dass es sich entweder um ModelFirst oder DatabaseFirst handelt. In diesem Fall wird der Code basierend auf der CSDL generiert. Wenn Sie Property-Namen konvertieren, wird der Inhalt nicht mehr funktionieren, da EF nicht in der Lage ist, Typen und Eigenschaften zu finden, die den Property-Namen in der CSDL entsprechen. Sobald der Code neu generiert wird (z. B. wenn Sie Ihr Modell speichern), werden Sie alle Änderungen verlieren. Was Sie tun müssen, ist die Namen der Eigenschaften in der CSDL (der konzeptionelle Teil der EDMX) und dann MSL (der Mapping-Teil von EDMX) entsprechend zu ändern. Sie suchen also tatsächlich nach Xml. Ich denke, es kann relativ einfach mit Xslt oder Linq zu Xml getan werden, wenn Sie mit diesen Technologien vertraut sind. Wenn Sie dies richtig machen, sollte die Codegenerator/T4-Vorlage einen Code mit den von Ihnen angegebenen Namen generieren. Alternativ können Sie Namen im EF-Designer manuell ändern, aber es wird viel Arbeit.

2

Vor etwa 2 Wochen wurde ich damit beauftragt, Linq Connect als unseren Datenlieferanten für die Nutzung von EF für unsere ORM-Operationen loszuwerden. Nun, wie alle wissen, ist es bei Microsoft und Oracle nie einfach, da sie nicht gut zusammenspielen. Es lag an dem versierten Entwickler, eine Lösung für Pascal Casing und Pluralisation zu finden, so dass die aus der Oracle-Datenbank generierten Entitäten unseren Standards entsprachen. Wir wollten keine Tabellennamen mit Unterstrichen auf unseren Models sehen. Es brauchte ein bisschen Nachdenken und Entwicklung, um endlich zu einer guten Lösung zu kommen. Das Endergebnis war das Manipulieren der EDMX-Datei und dann das Ausführen der T4-Vorlagen, um die Magie geschehen zu lassen. Unser Endergebnis hat alle Entitäten und ihre Eigenschaften in Pascal-Gehäuse konvertiert. Es hat auch alle gespeicherten Funktionen in Pascal-Gehäuse umgewandelt. Navigationseigenschaften zur Sammlung wurden alle ebenfalls pluralisiert. Hier sind die Schritte und das Code-Snippet zu folgen. Hoffe, das hilft jemandem in der Programmiergemeinschaft und du kannst mich jederzeit auf seafarer_007 auf Twitter mit hilfreichen Kommentaren oder Vorschlägen erreichen. Hier ist es: 1. Generieren Sie das EDMX mit dem Element EF Data Model. Ich verwendete EF 5.0 in Visual Studio 2012. 2. Schreiben Sie eine Konsolenanwendung, die die EDMX- und die Designer-Dateien bearbeitet. Ich habe Referenzen zu beiden in der App Config hinzugefügt. 3. Das sollte es sein, und Sie werden Pascal und pluralisierte Entitäten haben. Sie können die Pascal-Fallmethode immer an Ihre Wünsche anpassen. 4. Ich habe den Code auf Visual Studio 2012 und EF 5.0 getestet. 5. Vorbehalt: Funktioniert nur mit einem einzigen formulierten Namespace ohne Punkte, im Grunde können Sie nicht OrgName.DeptName.Namespace für das Modell haben, es wird nur OrgName behandelt, Sie können jedoch die Pascal Casing-Methode optimieren, um das Problem zu lösen.

Konsolenanwendungscode unter:

static void Main (string [] args) {

 string pathFile = string.Empty; 
     string designFile = string.Empty; 


     //EDMX File location 
     if (ConfigurationManager.AppSettings["EDMX"] != null) 
     { 
      pathFile = ConfigurationManager.AppSettings["EDMX"].ToString(); 
     } 

     //Designer location for EF 5.0 
     if (ConfigurationManager.AppSettings["EDMXDiagram"] != null) 
     { 
      designFile = ConfigurationManager.AppSettings["EDMXDiagram"].ToString(); 
     } 





     XDocument xdoc = XDocument.Load(pathFile); 


     const string CSDLNamespace = "http://schemas.microsoft.com/ado/2009/11/edm"; 
     const string MSLNamespace = "http://schemas.microsoft.com/ado/2009/11/mapping/cs"; 

     XElement csdl = xdoc.Descendants(XName.Get("Schema", CSDLNamespace)).First(); 
     XElement msl = xdoc.Descendants(XName.Get("Mapping", MSLNamespace)).First(); 



     #region CSDL 
     foreach (var entitySet in csdl.Element(XName.Get("EntityContainer", CSDLNamespace)).Elements(XName.Get("EntitySet", CSDLNamespace))) 
     { 
      entitySet.Attribute("Name").Value = PascalCase(entitySet.Attribute("Name").Value); 
      entitySet.Attribute("EntityType").Value = PascalCase(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 = PascalCase(end.Attribute("EntitySet").Value); 
      } 
     } 

     foreach (var funtionSet in csdl.Element(XName.Get("EntityContainer", CSDLNamespace)).Elements(XName.Get("FunctionImport", CSDLNamespace))) 
     { 

      funtionSet.Attribute("Name").Value = PascalCase(funtionSet.Attribute("Name").Value); 

     } 

     foreach (var entityType in csdl.Elements(XName.Get("EntityType", CSDLNamespace))) 
     { 
      entityType.Attribute("Name").Value = PascalCase(entityType.Attribute("Name").Value); 

      foreach (var key in entityType.Elements(XName.Get("Key", CSDLNamespace))) 
      { 
       foreach (var propertyRef in key.Elements(XName.Get("PropertyRef", CSDLNamespace))) 
       { 
        propertyRef.Attribute("Name").Value = PascalCase(propertyRef.Attribute("Name").Value); 
       } 
      } 

      foreach (var property in entityType.Elements(XName.Get("Property", CSDLNamespace))) 
      { 
       property.Attribute("Name").Value = PascalCase(property.Attribute("Name").Value); 
      } 

      foreach (var navigationProperty in entityType.Elements(XName.Get("NavigationProperty", CSDLNamespace))) 
      { 
       navigationProperty.Attribute("Name").Value = PascalCase(navigationProperty.Attribute("Name").Value, true, true); 
      } 

     } 
     foreach (var association in csdl.Elements(XName.Get("Association", CSDLNamespace))) 
     { 
      foreach (var end in association.Elements(XName.Get("End", CSDLNamespace))) 
      { 
       end.Attribute("Type").Value = PascalCase(end.Attribute("Type").Value); 
      }    

      foreach(var refs in association.Elements(XName.Get("ReferentialConstraint", CSDLNamespace))) 
      { 

       foreach (var pri in refs.Elements(XName.Get("Principal", CSDLNamespace))) 
       { 

        foreach (var proref in pri.Elements(XName.Get("PropertyRef", CSDLNamespace))) 
        { 

         proref.Attribute("Name").Value = PascalCase(proref.Attribute("Name").Value); 
        } 

       } 

       foreach (var pri in refs.Elements(XName.Get("Dependent", CSDLNamespace))) 
       { 

        foreach (var proref in pri.Elements(XName.Get("PropertyRef", CSDLNamespace))) 
        { 

         proref.Attribute("Name").Value = PascalCase(proref.Attribute("Name").Value); 
        } 

       } 


      } 



     } 
     #endregion 

     #region MSL 

     foreach (var entitySetMapping in msl.Element(XName.Get("EntityContainerMapping", MSLNamespace)).Elements(XName.Get("EntitySetMapping", MSLNamespace))) 
     { 
      entitySetMapping.Attribute("Name").Value = PascalCase(entitySetMapping.Attribute("Name").Value); 

      foreach (var entityTypeMapping in entitySetMapping.Elements(XName.Get("EntityTypeMapping", MSLNamespace))) 
      { 
       entityTypeMapping.Attribute("TypeName").Value = PascalCase(entityTypeMapping.Attribute("TypeName").Value); 
       foreach 
       (var scalarProperty in 
       (entityTypeMapping.Element(XName.Get("MappingFragment", MSLNamespace))).Elements(XName.Get("ScalarProperty", MSLNamespace)) 
       ) 
       { 
        scalarProperty.Attribute("Name").Value = PascalCase(scalarProperty.Attribute("Name").Value); 
       } 

      } 
     } 
     foreach (var associationSetMapping in msl.Element(XName.Get("EntityContainerMapping", MSLNamespace)).Elements(XName.Get("AssociationSetMapping", MSLNamespace))) 
     { 
      foreach (var endProperty in associationSetMapping.Elements(XName.Get("EndProperty", MSLNamespace))) 
      { 
       foreach (var scalarProperty in endProperty.Elements(XName.Get("ScalarProperty", MSLNamespace))) 
       { 
        scalarProperty.Attribute("Name").Value = PascalCase(scalarProperty.Attribute("Name").Value); 
       } 
      } 
     } 

     foreach (var functionSetMapping in msl.Element(XName.Get("EntityContainerMapping", MSLNamespace)).Elements(XName.Get("FunctionImportMapping", MSLNamespace))) 
     { 
      functionSetMapping.Attribute("FunctionImportName").Value = PascalCase(functionSetMapping.Attribute("FunctionImportName").Value); 
     } 
     #endregion 

     xdoc.Save(pathFile); 


     XmlDocument designXml = new XmlDocument(); 

     designXml.Load(designFile);  


     XmlNamespaceManager dsMan = new XmlNamespaceManager(designXml.NameTable); 
     dsMan.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2009/11/edmx"); 
     dsMan.AddNamespace("d", "http://schemas.microsoft.com/ado/2009/11/edmx"); 


     #region Designer 

     XmlNodeList entitySet1 = designXml.DocumentElement.SelectNodes("//d:Diagrams", dsMan); 

     foreach (XmlNode xn in entitySet1) 
     { 

      foreach (XmlElement xp in xn.ChildNodes) 
      { 

       foreach (XmlElement z in xp.ChildNodes) 
       { 

        if (z.Attributes[0].Name == "EntityType") 
        { 

         z.Attributes[0].Value = PascalCase(z.Attributes[0].Value.ToString(), true); 

        } 


       } 

      } 


     } 

     designXml.Save(designFile); 


     #endregion 

    } 

    #region Pluralization 


    public static string Pluralize(string name) 
    { 

    return System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new CultureInfo("en-US")).Pluralize(name); 
    } 



    #endregion 



    #region Pascal Casing 

    public static string PascalCase(StructuralType type, bool sanitizeName = true) 
    { 
     if (type == null) 
     { 
      return null; 
     } 

     return PascalCase(type.Name, sanitizeName); 
    } 


    public static string PascalCase(EdmMember member, bool sanitizeName = true) 
    { 
     if (member == null) 
     { 
      return null; 
     } 

     return PascalCase(member.Name, sanitizeName); 
    } 

    public static string PascalCase(string name, bool sanitizeName = true, bool pluralize = false) 
    { 

     // if pascal case exists 
     // exit function 

     Regex rgx = new Regex(@"^[A-Z][a-z]+(?:[A-Z][a-z]+)*$"); 

     string pascalTest = name; 

     if (name.Contains(".")) 
     { 
      string[] test = new string[]{}; 
      test = name.Split('.'); 

      if(rgx.IsMatch(test[1].ToString())) 
      { 
       return name; 
      } 

     } 
     else 
     { 

      if (rgx.IsMatch(name)) 
      { 
       return name; 
      } 

     } 

     //Check for dot notations in namespace 

     bool contains = false; 
     string[] temp = new string[] { }; 
     var namespc = string.Empty; 

     if (name.Contains(".")) 
     { 
      contains = true; 
      temp = name.Split('.'); 
      namespc = temp[0]; 

     } 

     if (contains) 
     { 
      name = temp[1]; 
     } 

     name = name.ToLowerInvariant(); 

     string result = name; 
     bool upperCase = false; 

     result = string.Empty; 
     for (int i = 0; i < name.Length; i++) 
     { 
      if (name[i] == ' ' || name[i] == '_') 
      { 
       upperCase = true; 
      } 
      else 
      { 
       if (i == 0 || upperCase) 
       { 
        result += name[i].ToString().ToUpperInvariant(); 
        upperCase = false; 
       } 
       else 
       { 
        result += name[i]; 
       } 
      } 
     } 


     if (contains) 
     { 


      result = namespc.ToString() + "." + result; 



     } 

     if (pluralize) 
     { 
      result = Pluralize(result); 
     } 


     return result; 
    } 
    #endregion 
Verwandte Themen