internal static EntityStoreSchemaFilterEffect GetEffectViaFilter(
            this EntityStoreSchemaFilterEntry entryToTest, IEnumerable <EntityStoreSchemaFilterEntry> filterEntries)
        {
            var effect = EntityStoreSchemaFilterEffect.Exclude;

            // Look for the all filter for specific type of object; this includes the 'All' types filter
            foreach (var entry in filterEntries.Where(e => e.Name == "%" && (e.Types & entryToTest.Types) == entryToTest.Types))
            {
                effect = entry.Effect;
                break;
            }

            // Look for the specific type of object
            foreach (var entry in filterEntries.Where(
                         e =>
                         e.Catalog.Equals(entryToTest.Catalog ?? String.Empty, StringComparison.CurrentCulture) &&
                         e.Schema.Equals(entryToTest.Schema ?? String.Empty, StringComparison.CurrentCulture) &&
                         e.Name.Equals(entryToTest.Name ?? String.Empty, StringComparison.CurrentCulture)))
            {
                effect = entry.Effect;
                break;
            }

            return(effect);
        }
 private void SetStoreMetadataFilters()
 {
     GetStoreSchemas(Settings).Each(s =>
     {
         var effect = s == Settings.StoreSchemaNamespace ? EntityStoreSchemaFilterEffect.Allow : EntityStoreSchemaFilterEffect.Exclude;
         _storeMetadataFilters[s] = new EntityStoreSchemaFilterEntry(null, s, null, EntityStoreSchemaFilterObjectTypes.Table, effect);
     });
 }
        private EntityStoreSchemaFilterEntry IgnoreTable(string tableName)
        {
            var filter = new EntityStoreSchemaFilterEntry(
                null,
                null,
                tableName,
                EntityStoreSchemaFilterObjectTypes.Table,
                EntityStoreSchemaFilterEffect.Exclude);

            return(filter);
        }
        private static void EnsureSchemaAndLeafNode(
            TreeNode rootNode,
            EntityStoreSchemaFilterEntry entry,
            TreeViewImage leafNodeImage)
        {
            Debug.Assert(rootNode != null, "rootNode must be non-null");
            Debug.Assert(entry != null, "entry must be non-null");

            var dbObj = DatabaseObject.CreateFromEntityStoreSchemaFilterEntry(entry, null);

            EnsureSchemaAndLeafNode(rootNode, dbObj, leafNodeImage, entry);
        }
Beispiel #5
0
        internal static DatabaseObject CreateFromEntityStoreSchemaFilterEntry(EntityStoreSchemaFilterEntry entry, string defaultSchemaName)
        {
            var dbObj = new DatabaseObject();

            dbObj.Name   = entry.Name;
            dbObj.Schema = entry.Schema;

            // sometimes the database returns null for the schema whereas the EDM wants to
            // use the EntityContainer name as the default schema name - here we allow
            // overriding the schema name if it is not defined from the EntityStoreSchemaFilterEntry
            if (null == dbObj.Schema)
            {
                dbObj.Schema = defaultSchemaName;
            }

            return(dbObj);
        }
        public static void EnsureSchemaAndLeafNode(
            TreeNode rootNode,
            DatabaseObject dbObj,
            TreeViewImage leafNodeImage,
            EntityStoreSchemaFilterEntry leafNodeTagObject)
        {
            Debug.Assert(rootNode != null, "rootNode must be non-null");
            if (rootNode == null)
            {
                return;
            }
            // find or create schema node
            var schemaName = (dbObj.Schema ?? Resources.SelectTablesPage_NullSchemaDisplayName);
            var schemaNode = FindOrCreateTreeSchemaNode(rootNode, schemaName, TreeViewImage.DbDatabaseSchemaImage);

            Debug.Assert(schemaNode != null, "null schemaNode for rootNode with label " + rootNode.Name + ", schemaName " + schemaName);
            if (schemaNode != null)
            {
                // now add child node to schema node
                var detailNode = CreateTreeNode(dbObj.Name, false, leafNodeTagObject, dbObj.Name, leafNodeImage, null);
                schemaNode.Nodes.Add(detailNode);
            }
        }
        // internal to allow unit testing
        internal static StringBuilder AppendFilterEntry(
            StringBuilder segment, string alias, EntityStoreSchemaFilterEntry entry, ParameterCollectionBuilder parameters)
        {
            Debug.Assert(segment != null, "segment != null");
            Debug.Assert(alias != null, "alias != null");
            Debug.Assert(entry != null, "entry != null");
            Debug.Assert(parameters != null, "parameters != null");

            var filterText = new StringBuilder();

            AppendComparison(filterText, alias, "CatalogName", entry.Catalog, parameters);
            AppendComparison(filterText, alias, "SchemaName", entry.Schema, parameters);
            AppendComparison(
                filterText, alias, "Name",
                entry.Catalog == null && entry.Schema == null && entry.Name == null ? "%" : entry.Name,
                parameters);
            segment
            .AppendIfNotEmpty(" OR ")
            .Append("(")
            .Append(filterText)
            .Append(")");

            return(segment);
        }
Beispiel #8
0
        // End Added ErikEJ

        #region the functions that actually do the interesting things

        private static void ModelGen(
            string connectionString, string provider, string modelName, Version version, bool includeForeignKeys, bool pluralize, List <string> tables)
        {
            IList <EdmSchemaError> ssdlErrors       = null;
            IList <EdmSchemaError> csdlAndMslErrors = null;

            // generate the SSDL
            string ssdlNamespace            = modelName + "Model.Store";
            EntityStoreSchemaGenerator essg =
                new EntityStoreSchemaGenerator(
                    provider, connectionString, ssdlNamespace);

            essg.GenerateForeignKeyProperties = includeForeignKeys;

            //ErikEJ Filter selected tables
            var filters = new List <EntityStoreSchemaFilterEntry>();

            foreach (var table in tables)
            {
                var entry = new EntityStoreSchemaFilterEntry(null, null, table);
                filters.Add(entry);
            }
            ssdlErrors = essg.GenerateStoreMetadata(filters, version);

            // detect if there are errors or only warnings from ssdl generation
            bool hasSsdlErrors   = false;
            bool hasSsdlWarnings = false;

            if (ssdlErrors != null)
            {
                foreach (EdmSchemaError e in ssdlErrors)
                {
                    if (e.Severity == EdmSchemaErrorSeverity.Error)
                    {
                        hasSsdlErrors = true;
                    }
                    else if (e.Severity == EdmSchemaErrorSeverity.Warning)
                    {
                        hasSsdlWarnings = true;
                    }
                }
            }

            // write out errors & warnings
            if (hasSsdlErrors && hasSsdlWarnings)
            {
                //System.Console.WriteLine("Errors occurred during generation:");
                WriteErrors(ssdlErrors);
            }

            // if there were errors abort.  Continue if there were only warnings
            if (hasSsdlErrors)
            {
                return;
            }

            // write the SSDL to a string
            using (StringWriter ssdl = new StringWriter())
            {
                XmlWriter ssdlxw = XmlWriter.Create(ssdl);
                essg.WriteStoreSchema(ssdlxw);
                ssdlxw.Flush();

                // generate the CSDL
                string csdlNamespace            = modelName + "Model";
                string csdlEntityContainerName  = modelName + "Entities";
                EntityModelSchemaGenerator emsg =
                    new EntityModelSchemaGenerator(
                        essg.EntityContainer, csdlNamespace, csdlEntityContainerName);
                emsg.GenerateForeignKeyProperties = includeForeignKeys;

                // Begin Added ErikEJ
                if (pluralize)
                {
                    emsg.PluralizationService = System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
                }
                // End Added ErikEJ
                csdlAndMslErrors = emsg.GenerateMetadata(version);


                // detect if there are errors or only warnings from csdl/msl generation
                bool hasCsdlErrors   = false;
                bool hasCsdlWarnings = false;
                if (csdlAndMslErrors != null)
                {
                    foreach (EdmSchemaError e in csdlAndMslErrors)
                    {
                        if (e.Severity == EdmSchemaErrorSeverity.Error)
                        {
                            hasCsdlErrors = true;
                        }
                        else if (e.Severity == EdmSchemaErrorSeverity.Warning)
                        {
                            hasCsdlWarnings = true;
                        }
                    }
                }

                // write out errors & warnings
                if (hasCsdlErrors || hasCsdlWarnings)
                {
                    //System.Console.WriteLine("Errors occurred during generation:");
                    WriteErrors(csdlAndMslErrors);
                }

                // if there were errors, abort.  Don't abort if there were only warnigns.
                if (hasCsdlErrors)
                {
                    return;
                }

                // write CSDL to a string
                using (StringWriter csdl = new StringWriter())
                {
                    XmlWriter csdlxw = XmlWriter.Create(csdl);
                    emsg.WriteModelSchema(csdlxw);
                    csdlxw.Flush();

                    // write MSL to a string
                    using (StringWriter msl = new StringWriter())
                    {
                        XmlWriter mslxw = XmlWriter.Create(msl);
                        emsg.WriteStorageMapping(mslxw);
                        mslxw.Flush();

                        // write csdl, ssdl & msl to the EDMX file
                        ToEdmx(
                            csdl.ToString(), ssdl.ToString(), msl.ToString(), new FileInfo(
                                modelName + ".edmx"), includeForeignKeys, pluralize);
                    }
                }
            }
        }
        private static void AddFilterEntry(EntityCommand command, StringBuilder segment, string alias, EntityStoreSchemaFilterEntry entry)
        {
            
            StringBuilder filterText = new StringBuilder();
            AddComparison(command, filterText, alias, "CatalogName", entry.Catalog);
            AddComparison(command, filterText, alias, "SchemaName", entry.Schema);

            string name = entry.Name;
            bool allNull = (entry.Catalog == null && entry.Schema == null && entry.Name == null);
            if (allNull)
            {
                name = "%";
            }
            AddComparison(command, filterText, alias, "Name", name);

            if (segment.Length != 0)
            {
                segment.Append(" OR ");
            }
            segment.Append("(");
            segment.Append(filterText);
            segment.Append(")");
        }
        private static void AddFilterEntry(EntityCommand command, StringBuilder segment, string alias, EntityStoreSchemaFilterEntry entry)
        {
            StringBuilder filterText = new StringBuilder();

            AddComparison(command, filterText, alias, "CatalogName", entry.Catalog);
            AddComparison(command, filterText, alias, "SchemaName", entry.Schema);

            string name    = entry.Name;
            bool   allNull = (entry.Catalog == null && entry.Schema == null && entry.Name == null);

            if (allNull)
            {
                name = "%";
            }
            AddComparison(command, filterText, alias, "Name", name);

            if (segment.Length != 0)
            {
                segment.Append(" OR ");
            }
            segment.Append("(");
            segment.Append(filterText);
            segment.Append(")");
        }
        // internal to allow unit testing
        internal static StringBuilder AppendFilterEntry(
            StringBuilder segment, string alias, EntityStoreSchemaFilterEntry entry, EntityParameterCollection parameters)
        {
            Debug.Assert(segment != null, "segment != null");
            Debug.Assert(alias != null, "alias != null");
            Debug.Assert(entry != null, "entry != null");
            Debug.Assert(parameters != null, "parameters != null");

            var filterText = new StringBuilder();
            AppendComparison(filterText, alias, "CatalogName", entry.Catalog, parameters);
            AppendComparison(filterText, alias, "SchemaName", entry.Schema, parameters);
            AppendComparison(
                filterText, alias, "Name",
                entry.Catalog == null && entry.Schema == null && entry.Name == null ? "%" : entry.Name,
                parameters);
            segment
                .AppendIfNotEmpty(" OR ")
                .Append("(")
                .Append(filterText)
                .Append(")");

            return segment;
        }
Beispiel #12
0
        public IEnumerable <KeyValuePair <string, string> > generate(string connectionString, string projectName, string @namespace, DatabaseSetting dbSetting)
        {
            try
            {
                DatabaseManager dbManager = new DatabaseManager(connectionString, dbSetting);
                if (!dbManager.connect())
                {
                    return(null);
                }
                var schemaFilterEntryBag = new SchemaFilterEntryBag();
                var databaseTables       = new ArrayList();
                databaseTables = dbManager.GetDatabaseTables();
                if (databaseTables.Count != 0)
                {
                    for (var i = 0; i < databaseTables.Count; i++)
                    {
                        var tableItem = (Tuple <string, string, string>)(databaseTables[i]);
                        var item      = new EntityStoreSchemaFilterEntry(tableItem.Item1,
                                                                         tableItem.Item2, tableItem.Item3, EntityStoreSchemaFilterObjectTypes.Table,
                                                                         EntityStoreSchemaFilterEffect.Allow);
                        schemaFilterEntryBag.IncludedTableEntries.Add(item);
                    }
                }
                var databaseViews = new ArrayList();
                databaseViews = dbManager.GetDatabaseViews();
                if (databaseViews.Count != 0)
                {
                    for (var i = 0; i < databaseViews.Count; i++)
                    {
                        var viewItem = (Tuple <string, string, string>)(databaseViews[i]);
                        var item     = new EntityStoreSchemaFilterEntry(viewItem.Item1,
                                                                        viewItem.Item2, viewItem.Item3, EntityStoreSchemaFilterObjectTypes.View,
                                                                        EntityStoreSchemaFilterEffect.Allow);
                        schemaFilterEntryBag.IncludedViewEntries.Add(item);
                    }
                }


                var modelBuilderSettings = new ModelBuilderSettings();
                modelBuilderSettings._designTimeConnectionString      = connectionString;
                modelBuilderSettings._designTimeProviderInvariantName =
                    dbSetting.ProviderInvariantName;
                modelBuilderSettings._runtimeProviderInvariantName =
                    dbSetting.ProviderInvariantName;
                modelBuilderSettings.UsePluralizationService   = true;
                modelBuilderSettings.IncludeForeignKeysInModel = true;

                modelBuilderSettings.DatabaseObjectFilters =
                    schemaFilterEntryBag.CollapseAndOptimize(SchemaFilterPolicy.GetByValEdmxPolicy());
                modelBuilderSettings.ModelBuilderEngine = new CodeFirstModelBuilderEngine();
                // The latest EntityFramework version
                modelBuilderSettings.TargetSchemaVersion = new Version(3, 0, 0, 0);

                // Get the providerManifestTokern
                IDbDependencyResolver resolver = Microsoft.Data.Entity.Design.VersioningFacade.DependencyResolver.Instance;
                var providerServices           =
                    resolver.GetService <System.Data.Entity.Core.Common.DbProviderServices>(dbSetting.ProviderInvariantName);
                var factory      = DbProviderFactories.GetFactory(dbSetting.ProviderInvariantName);
                var dbconnection = factory.CreateConnection();
                dbconnection.ConnectionString = connectionString;
                Debug.Assert(providerServices != null, "Trying to get unregistered provider.");
                modelBuilderSettings.ProviderManifestToken = providerServices.GetProviderManifestToken(dbconnection);

                // the function provided by EntityFramework to generate model from a database
                var mbe = modelBuilderSettings.ModelBuilderEngine;
                mbe.GenerateModel(modelBuilderSettings);

                // the function provided by EntityFramework to generate code from a model
                var    generator = new CodeFirstModelGenerator();
                var    result    = generator.Generate(mbe.Model, @namespace + ".Models", projectName + "DbContext", projectName);
                string key       = projectName + "DbContext.cs";
                if (dbSetting.DBType == DatabaseType.MYSQL)
                {
                    return(result.Where(c => !c.Key.Equals(key)).Concat(
                               new[] { new KeyValuePair <string, string>(key, addMySqlNamespace(result.First(c => c.Key.Equals(key)).Value)) }));
                }

                return(result);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return(null);
            }
        }