Entity Framework – Capitalisation de la première lettre du nom de la propriété

En général, j’ai tendance à nommer les colonnes de ma firebase database SQL à l’aide de la convention de cas de chameau suivante:

camelCase (notez que la première lettre est en minuscule).

Mais lorsque je travaille avec C #, j’aime nommer les propriétés publiques de mon object dans la convention suivante:

CamelCase (notez que le premier est dans le cas supérieur).

Le comportement par défaut d’Entity Framework consiste à nommer les propriétés des classes créées afin qu’elles correspondent à leurs noms de colonne relatifs, telles qu’elles se trouvent dans la firebase database.

Existe-t-il une propriété au niveau du projet / de la solution pouvant être modifiée afin de résoudre ce problème?

Oui il y a. Ici vous pouvez voir l’exemple complet:

 using System; using System.Data.Entity; namespace ConsoleApplication1 { class MyDbContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Properties().Configure(c => { var name = c.ClrPropertyInfo.Name; var newName = char.ToLower(name[0]) + name.Subssortingng(1); c.HasColumnName(newName); }); } public MyDbCondenxt(ssortingng cs) : base(cs) { } public DbSet MyModels { get; set; } } class Program { static void Main(ssortingng[] args) { var context = new MyDbContext ("DefaultConnection"); context.MyModels.Add(new MyModel{SomeText = "hello"}); context.SaveChanges(); Console.ReadLine(); } } class MyModel { public int Id { get; set; } public ssortingng SomeText { get; set; } } } 

Le nom de la propriété est “SomeText” et le nom de la colonne est “someText”.

Je ne connais pas de niveau de solution, mais vous pouvez définir un atsortingbut sur votre entité.

 [Table("myEntity")] public class MyEntity{} 

Réaliser cela n’est pas impossible, mais ce ne sera pas facile. Cela dépend en partie du type de modèle ef avec lequel vous travaillez, code d’abord ou firebase database / modèle d’abord (ils sont similaires à cet égard), ou si vous utilisez les anciennes méthodes basées sur ObjectContext.

En général, EF utilise le modèle T4 pour créer les classes et modèles réels dans tous les codes sauf le code. Il est donc possible de modifier les modèles T4 et de générer ce que vous voulez, par exemple, générer automatiquement des propriétés avec PascalCasing.

Si vous utilisez d’abord le code (ce qui ne nécessite pas vraiment de code, c’est un nom terrible), vous pouvez utiliser les outils puissants d’Entity Framework pour procéder à l’ingénierie inverse de votre firebase database afin de coder les premiers modèles, et encore une fois, il utilise T4. ce.

Si vous utilisez d’abord le code réel (c’est-à-dire que vous créez vos modèles et générez votre firebase database à partir du modèle), il se peut que cela ne soit pas possible avec le EF5 existant ou une version inférieure. EF6 (actuellement en version alpha) a quelque chose de connu sous le nom de conventions personnalisées que vous pourriez probablement utiliser pour cela, mais cela rest loin de la qualité de la production.

Plus tôt, j’avais aussi ce genre de problème. J’écris donc simplement un outil en c # pour renommer le fichier edmx existant, puis après avoir renommé chaque section du fichier edmx, Ensuite, à l’aide d’un modèle T4, régénérez les classes Poco. Cela a résolu mon problème. Il génère les classes POCO attendues avec les propriétés Camel Case. En gros, dans edmx, nous avons 3 couches. Nous devons donc en modifier 2 couches.

  • MappingsSection
  • ConceptualModelsSection

S’il vous plaît trouver la classe suivante pour le faire.

 namespace Edmx_Manager_V1._0 { using System; using System.Collections.Generic; using System.Linq; using System.Xml; public static class RenameManager { public static XmlDocument Document = new XmlDocument(); public static ssortingng FilePath; public static XmlNamespaceManager nsmgr; ///  /// Updates the conceptual models section. ///  public static void UpdateConceptualModelsSection() { ///////////////////////update ConceptualModels section////////////////////////////////////////////////////////// XmlNodeList Schema = Document.SelectNodes("/edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/edm:Schema", nsmgr); XmlNode SchemaNode = Schema[0]; XmlElement SchemaNodeXmlElement = SchemaNode as XmlElement; //get all EntitySet nodes under EntityContainer node XmlNodeList EntitySetlist = SchemaNodeXmlElement.GetElementsByTagName("EntitySet"); //get all EntityType nodes under SchemaNode XmlNodeList EntityTypelist = SchemaNodeXmlElement.GetElementsByTagName("EntityType"); foreach (XmlNode EntityTypenode in EntityTypelist) { //to call GetElementsByTagName we need XmlElement object XmlElement EntityTypenodeelement = EntityTypenode as XmlElement; //get all PropertyRef nodes under EntityType node XmlNodeList PropertyReflist = EntityTypenodeelement.GetElementsByTagName("PropertyRef"); foreach (XmlNode PropertyRefnode in PropertyReflist) { //update name atsortingbute of Key/PropertyRef nodes XmlAtsortingbute PropertyRef_nameAtsortingbute = PropertyRefnode.Atsortingbutes["Name"]; PropertyRef_nameAtsortingbute.Value = UppercaseFirst(PropertyRef_nameAtsortingbute.Value); } //get all Property nodes under EntityType node XmlNodeList Propertylist = EntityTypenodeelement.GetElementsByTagName("Property"); foreach (XmlNode Propertynode in Propertylist) { //update name atsortingbute of PropertyRef nodes XmlAtsortingbute Property_nameAtsortingbute = Propertynode.Atsortingbutes["Name"]; Property_nameAtsortingbute.Value = UppercaseFirst(Property_nameAtsortingbute.Value); } //get all NavigationProperty nodes under EntityType node XmlNodeList NavigationPropertylist = EntityTypenodeelement.GetElementsByTagName("NavigationProperty"); foreach (XmlNode NavigationPropertynode in NavigationPropertylist) { //update name atsortingbute of NavigationProperty nodes XmlAtsortingbute NavigationPropertynode_nameAtsortingbute = NavigationPropertynode.Atsortingbutes["Name"]; NavigationPropertynode_nameAtsortingbute.Value = UppercaseFirst(NavigationPropertynode_nameAtsortingbute.Value) + "s";// we append "s" for nav properties } } //get Association node under Schema node XmlNodeList Associationlist = SchemaNodeXmlElement.GetElementsByTagName("Association"); //get all Association nodes and process foreach (XmlNode AssociationNode in Associationlist) { if (AssociationNode != null) { XmlElement AssociationNodeXmlElement = AssociationNode as XmlElement; //get all end nodes under Association XmlNodeList EndNodelist2 = AssociationNodeXmlElement.GetElementsByTagName("End"); //get all PropertyRef nodes under Association XmlNodeList PropertyReflist2 = AssociationNodeXmlElement.GetElementsByTagName("PropertyRef"); foreach (XmlNode PropertyRefNode2 in PropertyReflist2) { //update Type atsortingbute XmlAtsortingbute PropertyRefNode2Atsortingbute = PropertyRefNode2.Atsortingbutes["Name"]; PropertyRefNode2Atsortingbute.Value = UppercaseFirst(PropertyRefNode2Atsortingbute.Value); } } } Console.WriteLine("ConceptualModelSection updated.."); } ///  /// Updates the mappings section. ///  public static void UpdateMappingsSection() { ///////////////////////update edmx:Mappings section////////////////////////////////////////////////////////// XmlNodeList EntityContainerMapping = Document.SelectNodes("/edmx:Edmx/edmx:Runtime/edmx:Mappings/cs:Mapping", nsmgr); XmlNode EntityContainerMapping_Node = EntityContainerMapping[0]; XmlElement EntityContainerMappingNode_XmlElement = EntityContainerMapping_Node as XmlElement; // update name atsortingbute of all EntitySetMapping nodes //get all EntitySetMapping nodes XmlNodeList EntitySetMappinglist = EntityContainerMappingNode_XmlElement.GetElementsByTagName("EntitySetMapping"); //get all EntityTypeMapping nodes XmlNodeList EntityTypeMappinglist = EntityContainerMappingNode_XmlElement.GetElementsByTagName("EntityTypeMapping"); //get all ScalarProperty nodes XmlNodeList ScalarPropertyist = EntityContainerMappingNode_XmlElement.GetElementsByTagName("ScalarProperty"); foreach (XmlNode ScalarPropertyNode in ScalarPropertyist) { XmlAtsortingbute nameAtsortingbute = ScalarPropertyNode.Atsortingbutes["Name"]; nameAtsortingbute.Value = UppercaseFirst(nameAtsortingbute.Value); } Console.WriteLine("MappingSection updated.."); } ///  /// Uppercases the first. ///  /// The name. ///  private static ssortingng UppercaseFirst(ssortingng name) { return char.ToUpper(name[0]) + name.Subssortingng(1); } } } 

Utilisation:

  RenameManager.FilePath = @"C:\Users\therath\testApp\Model1.edmx"; // Path of edmx file in the your solution RenameManager.Document.Load(@RenameManager.FilePath); RenameManager.nsmgr = new XmlNamespaceManager(RenameManager.Document.NameTable); RenameManager.nsmgr.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2008/10/edmx"); RenameManager.nsmgr.AddNamespace("edm", "http://schemas.microsoft.com/ado/2008/09/edm"); //nsmgr.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl"); RenameManager.nsmgr.AddNamespace("cs", "http://schemas.microsoft.com/ado/2008/09/mapping/cs"); try { RenameManager.UpdateConceptualModelsSection(); RenameManager.UpdateMappingsSection(); RenameManager.Document.Save(@RenameManager.FilePath); } catch (Exception ex) { MessageBox.Show(ex.Message.ToSsortingng()); } 

Si vous générez à nouveau edmx, vous devrez peut-être exécuter cet outil à nouveau.

il existe des moyens de le faire, certains sont déjà signalés par d’autres ..

j’ai trouvé une classe qui fait ça …

 namespace System.Data.Entity.ModelConfiguration.Conventions { ///  /// Convention to convert any data types that were explicitly specified, via data annotations or  API, /// to be lower case. The default SqlClient provider is case sensitive and requires data types to be lower case. This convention /// allows the  and  API to be case insensitive. /// ///  public sealed class ColumnTypeCasingConvention : IDbConvention, IConvention { internal ColumnTypeCasingConvention() { } [SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeSsortingngsToUppercase")] void IDbConvention.Apply(DbTableColumnMetadata tableColumn, DbDatabaseMetadata database) { if (ssortingng.IsNullOrWhiteSpace(tableColumn.TypeName)) return; tableColumn.TypeName = tableColumn.TypeName.ToLowerInvariant(); } 

}}

implémentation explicite de idbconvertion fait cette chose que vous pouvez implémenter

un autre est de

aller à la solution => et trouver le dossier obj / debug / edmxresourcestoembed

il y a trois fichiers db.csdl, db.msl, db.ssdl modifier le fichier msl => vous verrez le mappage de chaque table comme ci-dessous.

                 

Vous pouvez le changer dans le fichier .edmx. Cliquez simplement sur le nom de la propriété et renommez-le en cas de chameau et le même sera reflété lorsque vous tenterez d’y accéder à l’aide de l’object.

Vous pouvez utiliser des outils externes tels que http://www.devart.com/entitydeveloper/

Avec le générateur inbuild EDMX, cela n’est pas possible, car la routine “update from database” n’a pas une telle fonction.

Le code de classe est généré à partir d’un modèle T4. En fonction de votre configuration, cela peut déjà être dans votre projet ou l’EDMX peut en utiliser un intégré. Dans ce cas, vous devrez append votre propre stratégie et définir la “stratégie de génération de code” sur “Aucune” dans le gestionnaire EDMX. propriétés (via le navigateur de modèle). À partir de ce fichier, il est assez facile de trouver et de modifier la génération du nom de classe et de propriété.

La valeur par défaut appelle une fonction Escape , définie dans les fichiers include sous “IDE / Extensions / Microsoft / Outils de l’entité Framework / Templates / Includes” sous le dossier Visual Studio, et appelle finalement CreateEscapedIdentifier . Appelez simplement cela avec la version en majuscule de la chaîne.

FYI: Ces noms proviennent des objects EntityType et NavigationProperty tels que définis dans EDMX, et non directement de la firebase database. Si vous utilisez la fonction “générer à partir de la firebase database” pour EDMX, il est possible que les noms aient déjà subi une transformation et que les noms de table d’origine ne soient pas conservés dans le modèle. Ce ne sera probablement pas un problème, cependant.

En fait, vous pouvez éditer les noms dans edmx, mais chaque fois que vous actualisez à partir de la firebase database, vous le retrouvez.

La seule approche viable lors de l’utilisation de types de données de type edmx est d’avoir les noms corrects (en majuscules) dans les tables de la firebase database, sinon cela sera fastidieux.

Vous pouvez également utiliser link to sql, auquel cas vous définissez vos classes de données et fournissez simplement une propriété name. Mais soyez averti que cette approche est beaucoup plus manuelle et qu’elle est abandonnée dans la plupart des endroits car il faut beaucoup plus de reflection pour configurer cette génération automatique edmx qui consiste en un clic, un clic, une approche suivante.

Alors oui, vous pouvez éditer les noms dans edmx, mais envisagez plutôt d’abandonner votre table chamelCasing, en hommage à edmx, qui vous permet d’économiser une tonne de travail en retour, ou vos classes de proxy générées automatiquement .net auront l’air étrange, comme vous le savez.