如何使用 Oracle 实体框架支持强制使用 pascal 大小写?

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\n
Run Code Online (Sandbox Code Playgroud)\n