Ray*_*eng 2 c# oracle orm entity-framework
Oracle 的实体框架支持使所有类名都大写并保留下划线。因此 ORDER_ITEMS 表在类名中变为 ORDER_ITEMS。但我想使用帕斯卡大小写作为类名。
ORDER_ITEMS ==> 需要 OrderItems。
如何更改默认命名规则?
小智 5
大约两周前,我的任务是摆脱 Linq Connect 作为我们的数据提供者,转而使用 EF 进行 ORM 操作。众所周知,当微软和甲骨文参与其中时,事情绝非易事,因为它们不能很好地协同工作。精明的开发人员需要找到 Pascal 大小写和复数化的解决方案,以便从 Oracle 数据库生成的实体符合我们的标准。我们不希望带下划线的表名出现在我们的模型上。经过一番思考和开发,最终得出了一个好的解决方案。最终结果是操作 EDMX 文件,然后运行 T4 模板来实现奇迹。我们的最终结果将所有实体及其属性转换为帕斯卡大小写。它还将所有存储的函数转换为 Pascal 大小写。集合的导航属性也全部是复数的。以下是要遵循的步骤和代码片段。希望这对编码社区中的某些人有所帮助,您可以随时通过 Twitter 上的seafarer_007 与我联系,提出有用的评论或建议。如下: 1. 使用 EF 数据模型项生成 EDMX。我在 Visual Studio 2012 中使用了 EF 5.0。 2. 编写一个控制台应用程序来操作 EDMX 和设计器文件。我在应用程序配置中添加了对两者的引用。3. 应该就是这样,您将拥有 Pascal 大小写和复数实体。您可以随时根据自己的需要调整帕斯卡案例方法。4. 我在 Visual Studio 2012 和 EF 5.0 上测试了代码。5.警告:仅适用于不带点的单字命名空间,基本上您可以\xe2\x80\x99t为模型提供 OrgName.DeptName.Namespace,它只会处理 OrgName,但是,您可以调整 Pascal 大小写方法来解决那。
\n\n控制台应用程序代码如下:
\n\n static void Main(string[] args)\n {\n\n string pathFile = string.Empty;\n string designFile = string.Empty;\n\n\n //EDMX File location\n if (ConfigurationManager.AppSettings["EDMX"] != null)\n {\n pathFile = ConfigurationManager.AppSettings["EDMX"].ToString();\n }\n\n //Designer location for EF 5.0\n if (ConfigurationManager.AppSettings["EDMXDiagram"] != null)\n {\n designFile = ConfigurationManager.AppSettings["EDMXDiagram"].ToString();\n }\n\n\n\n\n\n XDocument xdoc = XDocument.Load(pathFile);\n\n\n const string CSDLNamespace = "http://schemas.microsoft.com/ado/2009/11/edm";\n const string MSLNamespace = "http://schemas.microsoft.com/ado/2009/11/mapping/cs";\n\n XElement csdl = xdoc.Descendants(XName.Get("Schema", CSDLNamespace)).First();\n XElement msl = xdoc.Descendants(XName.Get("Mapping", MSLNamespace)).First();\n\n\n\n #region CSDL\n foreach (var entitySet in csdl.Element(XName.Get("EntityContainer", CSDLNamespace)).Elements(XName.Get("EntitySet", CSDLNamespace)))\n {\n entitySet.Attribute("Name").Value = PascalCase(entitySet.Attribute("Name").Value);\n entitySet.Attribute("EntityType").Value = PascalCase(entitySet.Attribute("EntityType").Value);\n }\n foreach (var associationSet in csdl.Element(XName.Get("EntityContainer", CSDLNamespace)).Elements(XName.Get("AssociationSet", CSDLNamespace)))\n {\n foreach (var end in associationSet.Elements(XName.Get("End", CSDLNamespace)))\n {\n end.Attribute("EntitySet").Value = PascalCase(end.Attribute("EntitySet").Value);\n }\n }\n\n foreach (var funtionSet in csdl.Element(XName.Get("EntityContainer", CSDLNamespace)).Elements(XName.Get("FunctionImport", CSDLNamespace)))\n {\n\n funtionSet.Attribute("Name").Value = PascalCase(funtionSet.Attribute("Name").Value);\n\n }\n\n foreach (var entityType in csdl.Elements(XName.Get("EntityType", CSDLNamespace)))\n {\n entityType.Attribute("Name").Value = PascalCase(entityType.Attribute("Name").Value);\n\n foreach (var key in entityType.Elements(XName.Get("Key", CSDLNamespace)))\n {\n foreach (var propertyRef in key.Elements(XName.Get("PropertyRef", CSDLNamespace)))\n {\n propertyRef.Attribute("Name").Value = PascalCase(propertyRef.Attribute("Name").Value);\n }\n }\n\n foreach (var property in entityType.Elements(XName.Get("Property", CSDLNamespace)))\n {\n property.Attribute("Name").Value = PascalCase(property.Attribute("Name").Value);\n }\n\n foreach (var navigationProperty in entityType.Elements(XName.Get("NavigationProperty", CSDLNamespace)))\n {\n navigationProperty.Attribute("Name").Value = PascalCase(navigationProperty.Attribute("Name").Value, true, true); \n }\n\n }\n foreach (var association in csdl.Elements(XName.Get("Association", CSDLNamespace)))\n {\n foreach (var end in association.Elements(XName.Get("End", CSDLNamespace)))\n {\n end.Attribute("Type").Value = PascalCase(end.Attribute("Type").Value);\n } \n\n foreach(var refs in association.Elements(XName.Get("ReferentialConstraint", CSDLNamespace)))\n {\n\n foreach (var pri in refs.Elements(XName.Get("Principal", CSDLNamespace)))\n {\n\n foreach (var proref in pri.Elements(XName.Get("PropertyRef", CSDLNamespace)))\n {\n\n proref.Attribute("Name").Value = PascalCase(proref.Attribute("Name").Value);\n }\n\n }\n\n foreach (var pri in refs.Elements(XName.Get("Dependent", CSDLNamespace)))\n {\n\n foreach (var proref in pri.Elements(XName.Get("PropertyRef", CSDLNamespace)))\n {\n\n proref.Attribute("Name").Value = PascalCase(proref.Attribute("Name").Value);\n }\n\n }\n\n\n }\n\n\n\n }\n #endregion\n\n #region MSL\n\n foreach (var entitySetMapping in msl.Element(XName.Get("EntityContainerMapping", MSLNamespace)).Elements(XName.Get("EntitySetMapping", MSLNamespace)))\n {\n entitySetMapping.Attribute("Name").Value = PascalCase(entitySetMapping.Attribute("Name").Value);\n\n foreach (var entityTypeMapping in entitySetMapping.Elements(XName.Get("EntityTypeMapping", MSLNamespace)))\n {\n entityTypeMapping.Attribute("TypeName").Value = PascalCase(entityTypeMapping.Attribute("TypeName").Value);\n foreach\n (var scalarProperty in\n (entityTypeMapping.Element(XName.Get("MappingFragment", MSLNamespace))).Elements(XName.Get("ScalarProperty", MSLNamespace))\n )\n {\n scalarProperty.Attribute("Name").Value = PascalCase(scalarProperty.Attribute("Name").Value);\n }\n\n }\n }\n foreach (var associationSetMapping in msl.Element(XName.Get("EntityContainerMapping", MSLNamespace)).Elements(XName.Get("AssociationSetMapping", MSLNamespace)))\n {\n foreach (var endProperty in associationSetMapping.Elements(XName.Get("EndProperty", MSLNamespace)))\n {\n foreach (var scalarProperty in endProperty.Elements(XName.Get("ScalarProperty", MSLNamespace)))\n {\n scalarProperty.Attribute("Name").Value = PascalCase(scalarProperty.Attribute("Name").Value);\n }\n }\n }\n\n foreach (var functionSetMapping in msl.Element(XName.Get("EntityContainerMapping", MSLNamespace)).Elements(XName.Get("FunctionImportMapping", MSLNamespace)))\n {\n functionSetMapping.Attribute("FunctionImportName").Value = PascalCase(functionSetMapping.Attribute("FunctionImportName").Value);\n }\n #endregion\n\n xdoc.Save(pathFile);\n\n\n XmlDocument designXml = new XmlDocument();\n\n designXml.Load(designFile); \n\n\n XmlNamespaceManager dsMan = new XmlNamespaceManager(designXml.NameTable);\n dsMan.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2009/11/edmx");\n dsMan.AddNamespace("d", "http://schemas.microsoft.com/ado/2009/11/edmx");\n\n\n #region Designer\n\n XmlNodeList entitySet1 = designXml.DocumentElement.SelectNodes("//d:Diagrams", dsMan);\n\n foreach (XmlNode xn in entitySet1)\n {\n\n foreach (XmlElement xp in xn.ChildNodes)\n {\n\n foreach (XmlElement z in xp.ChildNodes)\n {\n\n if (z.Attributes[0].Name == "EntityType")\n {\n\n z.Attributes[0].Value = PascalCase(z.Attributes[0].Value.ToString(), true);\n\n }\n\n\n }\n\n }\n\n\n }\n\n designXml.Save(designFile);\n\n\n #endregion\n\n }\n\n #region Pluralization\n\n\n public static string Pluralize(string name)\n {\n\n return System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new CultureInfo("en-US")).Pluralize(name);\n }\n\n\n\n #endregion\n\n\n\n #region Pascal Casing\n\n public static string PascalCase(StructuralType type, bool sanitizeName = true)\n {\n if (type == null)\n {\n return null;\n }\n\n return PascalCase(type.Name, sanitizeName);\n }\n\n\n public static string PascalCase(EdmMember member, bool sanitizeName = true)\n {\n if (member == null)\n {\n return null;\n }\n\n return PascalCase(member.Name, sanitizeName);\n }\n\n public static string PascalCase(string name, bool sanitizeName = true, bool pluralize = false)\n {\n\n // if pascal case exists\n // exit function\n\n Regex rgx = new Regex(@"^[A-Z][a-z]+(?:[A-Z][a-z]+)*$");\n\n string pascalTest = name;\n\n if (name.Contains("."))\n {\n string[] test = new string[]{};\n test = name.Split(\'.\');\n\n if(rgx.IsMatch(test[1].ToString()))\n {\n return name;\n }\n\n }\n else\n {\n\n if (rgx.IsMatch(name))\n {\n return name;\n }\n\n }\n\n //Check for dot notations in namespace\n\n bool contains = false;\n string[] temp = new string[] { };\n var namespc = string.Empty;\n\n if (name.Contains("."))\n {\n contains = true;\n temp = name.Split(\'.\');\n namespc = temp[0];\n\n }\n\n if (contains)\n {\n name = temp[1];\n }\n\n name = name.ToLowerInvariant();\n\n string result = name;\n bool upperCase = false;\n\n result = string.Empty;\n for (int i = 0; i < name.Length; i++)\n {\n if (name[i] == \' \' || name[i] == \'_\')\n {\n upperCase = true;\n }\n else\n {\n if (i == 0 || upperCase)\n {\n result += name[i].ToString().ToUpperInvariant();\n upperCase = false;\n }\n else\n {\n result += name[i];\n }\n }\n }\n\n\n if (contains)\n {\n\n\n result = namespc.ToString() + "." + result;\n\n\n\n }\n\n if (pluralize)\n {\n result = Pluralize(result);\n }\n\n\n return result;\n }\n #endregion\nRun Code Online (Sandbox Code Playgroud)\n