如何在Oracle的Entity Framework支持下强制执行Pascal案? [英] How to force pascal case with Oracle's Entity Framework support?

查看:69
本文介绍了如何在Oracle的Entity Framework支持下强制执行Pascal案?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Oracle的实体框架支持使所有类名变为大写并带有下划线. 因此,ORDER_ITEMS表在类名中成为ORDER_ITEMS.但我想使用Pascal大小写作为类名.

ORDER_ITEMS ==>需要OrderItems.

如何更改默认命名规则?

解决方案

大约2周前,我的任务是摆脱Linq Connect作为我们的数据提供者,而将EF用于我们的ORM操作.好吧,众所周知,当微软和甲骨文参与其中时,事情并非易事,因为它们不能很好地合作.精明的开发人员可以找到Pascal套管和复数化的解决方案,以便从Oracle数据库生成的实体符合我们的标准.我们不希望带下划线的表名显示在我们的模型中.经过一点点思考和发展,终于找到了一个好的解决方案.最终结果是处理EDMX文件,然后运行T4模板以使魔术发生.我们的最终结果将所有实体及其属性转换为Pascal大小写.它还将所有存储的功能转换为Pascal大小写.集合的导航属性也都被多元化了.以下是步骤和要遵循的代码段.希望这对编码社区的人有所帮助,您可以随时通过Twitter上的seafarer_007与我联系,并提供有用的意见或建议.它是这样的:1.使用EF数据模型项生成EDMX.我在Visual Studio 2012中使用了EF 5.0.2.编写一个可处理EDMX和设计器文件的控制台应用程序.我已经在App Config中添加了对这两者的引用. 3.就是这样,您将拥有Pascal装箱和复数的实体.您始终可以根据自己的需求调整Pascal案例方法. 4.我在Visual Studio 2012和EF 5.0上测试了代码. 5.警告:仅适用于带点的单个带单词的命名空间,基本上,您不能为模型提供OrgName.DeptName.Namespace,它只能处理OrgName,但是,您可以调整Pascal Casing方法来解决这个问题. >

下面的控制台应用程序代码:

    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

Oracle's entity framework support is making all class names upper case and carrying over underscore. So ORDER_ITEMS table becomes ORDER_ITEMS in class name. but I want to use Pascal case for class names.

ORDER_ITEMS ==> OrderItems is wanted.

How can I change the default naming rule?

解决方案

Around 2 weeks ago, I was tasked with getting rid of Linq Connect as our Data provider to using EF for our ORM operations. Well, as well all know it, things are never easy when Microsoft and Oracle are involved, as they don’t play well together. It was up to the savvy developer to find a solution for Pascal Casing and Pluralization, so that the Entities generated from the Oracle database matched our standards. We didn't want table names with underscores to show up on our Models. It took a little bit of thought and development to finally come to a good solution. The end result was manipulating the EDMX file and then running the T4 templates to make the magic happen. Our end result converted all the entities and their properties to Pascal casing. It also converted all the Stored functions to Pascal casing. Navigation properties to collection were all also pluralized. Here are the steps and the code snippet to follow. Hope this helps some one in the coding community and you can always reach out to me at seafarer_007 on twitter with helpful comments or suggestions. Here it is: 1. Generate the EDMX using the EF Data Model item. I used EF 5.0 in Visual Studio 2012. 2. Write a console app that manipulates the EDMX and the designer files. I have added references to both in the App Config. 3. That should be it, and you will have Pascal cased and Pluralized entities. You can always tweak the Pascal case method to your desires. 4. I tested the code on Visual Studio 2012 and EF 5.0. 5. Caveat : Works with only a single worded namespace without dots, basically you can’t have OrgName.DeptName.Namespace for the Model, it will only handle OrgName, however, you can tweak the Pascal Casing Method to resolve that.

Console Application code below:

    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

这篇关于如何在Oracle的Entity Framework支持下强制执行Pascal案?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆