internal static string ReverseEngineerCodeFirst( string modelsNamespace, string schema, string connectionString, string providerInvariant = "System.Data.SqlClient") { SqlConnection connection = new SqlConnection(connectionString); // Load store schema EntityStoreSchemaGenerator _EntityStoreSchemaGenerator = new EntityStoreSchemaGenerator(providerInvariant, connectionString, "dbo") { GenerateForeignKeyProperties = true }; _EntityStoreSchemaGenerator.GenerateStoreMetadata(new[] { new EntityStoreSchemaFilterEntry(null, schema, null, EntityStoreSchemaFilterObjectTypes.Table, EntityStoreSchemaFilterEffect.Allow) }); // Generate default mapping string contextName = connection .Database .Replace(" ", string.Empty) .Replace(".", string.Empty) + "Context"; EntityModelSchemaGenerator _EntityModelSchemaGenerator = new EntityModelSchemaGenerator( _EntityStoreSchemaGenerator.EntityContainer, modelsNamespace, contextName) { GenerateForeignKeyProperties = false }; _EntityModelSchemaGenerator.GenerateMetadata(); // Pull out info about types to be generated EntityType[] _EntityTypes = _EntityModelSchemaGenerator.EdmItemCollection.OfType <EntityType>().ToArray(); EdmMapping _EdmMapping = new EdmMapping(_EntityModelSchemaGenerator, _EntityStoreSchemaGenerator.StoreItemCollection); string result = string.Empty; foreach (EntityType type in _EntityTypes) { result = result + new Entity { Host = new TextTemplatingEngineHost { EntityType = type, EntityContainer = _EntityModelSchemaGenerator.EntityContainer, Namespace = modelsNamespace, TableSet = _EdmMapping.EntityMappings[type].Item1, PropertyToColumnMappings = _EdmMapping.EntityMappings[type].Item2, ManyToManyMappings = _EdmMapping.ManyToManyMappings } } }
private EntityModelSchemaGenerator GenerateDefaultMappings(EntityStoreSchemaGenerator storeGenerator) { var contextName = string.Concat(Settings.Domain, "Context"); var returnValue = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", contextName); returnValue.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); returnValue.GenerateForeignKeyProperties = true; returnValue.GenerateMetadata(); return(returnValue); }
internal void CreateCsdlAndMslFile(string csdlFilePath, string mslFilePath) { if (Store == null) { throw new Exception("Can't create the CSDL and MSL files, because the `Store` object is null."); } Models = new EntityModelSchemaGenerator(Store.StoreItemCollection, "ShoppingModelConceptual", "ShoppingModelConceptualContainer"); Models.GenerateMetadata(); Models.WriteModelSchema(csdlFilePath); Models.WriteStorageMapping(mslFilePath); }
private static EntityModelSchemaGenerator CreateEntityModelSchemaGenerator( EntityContainer entityContainer) { var entityModelSchemaGenerator = new EntityModelSchemaGenerator( entityContainer, "IgnoredNamespace", "IgnoredContextName"); entityModelSchemaGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en-US")); entityModelSchemaGenerator.GenerateForeignKeyProperties = true; entityModelSchemaGenerator.GenerateMetadata(); return(entityModelSchemaGenerator); }
private EntityModelSchemaGenerator GetEntityModelSchemaGenerator() { if (entityStoreSchemaGenerator == null) { return(null); } var modelGenerator = new EntityModelSchemaGenerator(entityStoreSchemaGenerator.EntityContainer, ApplicationName, ApplicationName); //modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); return(modelGenerator); }
private string GetCsdlXmlString(ObjectContext context) { if (context != null) { var entityContainerList = context.MetadataWorkspace.GetItems <EntityContainer>(DataSpace.SSpace); if (entityContainerList != null) { EntityContainer entityContainer = entityContainerList.FirstOrDefault(); var generator = new EntityModelSchemaGenerator(entityContainer); var stringBuilder = new StringBuilder(); var xmlWRiter = XmlWriter.Create(stringBuilder); generator.GenerateMetadata(); generator.WriteModelSchema(xmlWRiter); xmlWRiter.Flush(); return(stringBuilder.ToString()); } } return(string.Empty); }
/// <summary> /// 生成C#代码 /// </summary> public void ReverseEngineerCodeFirst(string strCon, List <string> tableNames = null, string savePath = null) { // Load store schema var storeGenerator = new EntityStoreSchemaGenerator("Oracle.ManagedDataAccess.Client", strCon, "dbo"); storeGenerator.GenerateForeignKeyProperties = true; var errors = storeGenerator.GenerateStoreMetadata(_storeMetadataFilters).Where(e => e.Severity == EdmSchemaErrorSeverity.Error); errors.HandleErrors(Strings.ReverseEngineer_SchemaError); // Generate default mapping var contextName = "CustomDbContext"; var modelGenerator = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", contextName); modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); // Pull out info about types to be generated var entityTypes = modelGenerator.EdmItemCollection.OfType <EntityType>().ToArray(); var mappings = new EdmMapping(modelGenerator, storeGenerator.StoreItemCollection); // Generate Entity Classes and Mappings var templateProcessor = new TemplateProcessor(null); var modelsNamespace = "EF.Models"; var modelsDirectory = savePath ?? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Codes"); if (!Directory.Exists(modelsDirectory)) { Directory.CreateDirectory(modelsDirectory); } var mappingNamespace = modelsNamespace + ".Mapping"; var mappingDirectory = Path.Combine(modelsDirectory, "Mapping"); if (!Directory.Exists(mappingDirectory)) { Directory.CreateDirectory(mappingDirectory); } var entityFrameworkVersion = new Version("6.0.0.0"); var matchs = (tableNames ?? new List <string>()).Where(q => q.EndsWith("*")).Select(q => q.TrimEnd('*')).ToList(); foreach (var entityType in entityTypes) { var enable = tableNames == null; if (tableNames != null && tableNames.Count > 0 && tableNames.Any(q => q.ToLower() == entityType.Name.ToLower())) { enable = true; } if (!enable && matchs != null && matchs.Count > 0 && matchs.Any(q => entityType.Name.ToLower().StartsWith(q.ToLower()))) { enable = true; } if (!enable) { continue; } // Generate the code file var entityHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = modelsNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var entityContents = templateProcessor.Process(Templates.EntityTemplate, entityHost); var filePath = Path.Combine(modelsDirectory, ToPascal(entityType.Name) + entityHost.FileExtension); File.WriteAllText(filePath, entityContents); var mappingHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = mappingNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var mappingContents = templateProcessor.Process(Templates.MappingTemplate, mappingHost); var mappingFilePath = Path.Combine(mappingDirectory, ToPascal(entityType.Name) + "Map" + mappingHost.FileExtension); File.WriteAllText(mappingFilePath, mappingContents); } if (tableNames == null || tableNames.Count == 0) { // Generate Context var contextHost = new EfTextTemplateHost { EntityContainer = modelGenerator.EntityContainer, Namespace = modelsNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion }; var contextContents = templateProcessor.Process(Templates.ContextTemplate, contextHost); var contextFilePath = Path.Combine(modelsDirectory, ToPascal(modelGenerator.EntityContainer.Name) + contextHost.FileExtension); File.WriteAllText(contextFilePath, contextContents); } }
public void ReverseEngineerCodeFirst(Project project) { Contract.Requires(project != null); try { // Show dialog with SqlClient selected by default var dialogFactory = _package.GetService <IVsDataConnectionDialogFactory>(); var dialog = dialogFactory.CreateConnectionDialog(); dialog.AddAllSources(); dialog.SelectedSource = new Guid("067ea0d9-ba62-43f7-9106-34930c60c528"); var dialogResult = dialog.ShowDialog(connect: true); if (dialogResult != null) { // Find connection string and provider _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_LoadSchema; var connection = (DbConnection)dialogResult.GetLockedProviderObject(); var connectionString = connection.ConnectionString; var providerManager = (IVsDataProviderManager)Package.GetGlobalService(typeof(IVsDataProviderManager)); IVsDataProvider dp; providerManager.Providers.TryGetValue(dialogResult.Provider, out dp); var providerInvariant = (string)dp.GetProperty("InvariantName"); // Load store schema var storeGenerator = new EntityStoreSchemaGenerator(providerInvariant, connectionString, "dbo"); storeGenerator.GenerateForeignKeyProperties = true; var errors = storeGenerator.GenerateStoreMetadata(_storeMetadataFilters).Where(e => e.Severity == EdmSchemaErrorSeverity.Error); errors.HandleErrors(Strings.ReverseEngineer_SchemaError); // Generate default mapping _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_GenerateMapping; var contextName = connection.Database.Replace(" ", string.Empty).Replace(".", string.Empty) + "Context"; var modelGenerator = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", contextName); modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); // Pull out info about types to be generated var entityTypes = modelGenerator.EdmItemCollection.OfType <EntityType>().ToArray(); var mappings = new EdmMapping(modelGenerator, storeGenerator.StoreItemCollection); // Find the project to add the code to var vsProject = (VSLangProj.VSProject)project.Object; var projectDirectory = new FileInfo(project.FileName).Directory; var projectNamespace = (string)project.Properties.Item("RootNamespace").Value; var references = vsProject.References.Cast <VSLangProj.Reference>(); if (!references.Any(r => r.Name == "EntityFramework")) { // Add EF References _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_InstallEntityFramework; try { project.InstallPackage("EntityFramework"); } catch (Exception ex) { _package.LogError(Strings.ReverseEngineer_InstallEntityFrameworkError, ex); } } // Generate Entity Classes and Mappings _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_GenerateClasses; var templateProcessor = new TemplateProcessor(project); var modelsNamespace = projectNamespace + ".Models"; var modelsDirectory = Path.Combine(projectDirectory.FullName, "Models"); var mappingNamespace = modelsNamespace + ".Mapping"; var mappingDirectory = Path.Combine(modelsDirectory, "Mapping"); var entityFrameworkVersion = GetEntityFrameworkVersion(references); foreach (var entityType in entityTypes) { // Generate the code file var entityHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = modelsNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var entityContents = templateProcessor.Process(Templates.EntityTemplate, entityHost); var filePath = Path.Combine(modelsDirectory, entityType.Name + entityHost.FileExtension); project.AddNewFile(filePath, entityContents); var mappingHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = mappingNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var mappingContents = templateProcessor.Process(Templates.MappingTemplate, mappingHost); var mappingFilePath = Path.Combine(mappingDirectory, entityType.Name + "Map" + mappingHost.FileExtension); project.AddNewFile(mappingFilePath, mappingContents); } // Generate Context _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_GenerateContext; var contextHost = new EfTextTemplateHost { EntityContainer = modelGenerator.EntityContainer, Namespace = modelsNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion }; var contextContents = templateProcessor.Process(Templates.ContextTemplate, contextHost); var contextFilePath = Path.Combine(modelsDirectory, modelGenerator.EntityContainer.Name + contextHost.FileExtension); var contextItem = project.AddNewFile(contextFilePath, contextContents); AddConnectionStringToConfigFile(project, connectionString, providerInvariant, modelGenerator.EntityContainer.Name); if (contextItem != null) { // Open context class when done _package.DTE2.ItemOperations.OpenFile(contextFilePath); } _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_Complete; } } catch (Exception exception) { _package.LogError(Strings.ReverseEngineer_Error, exception); } }
public void MyTest() { var names = new[] { "Simple", "Strings", "AllClrTypes", "GuidIdentity", "DateTime", "CompositeKey", "InverseMapping", "OneToMany", "ManyToMany", "AdventureWorks" }; //var reverse = new ReverseEngineerCodeFirstHandler(); foreach (var name in names) { // Load store schema var storeGenerator = new EntityStoreSchemaGenerator( "System.Data.SqlClient", $"Server=localhost;Database={name};Trusted_Connection=True;", "dbo"); storeGenerator.GenerateForeignKeyProperties = true; var errors = storeGenerator.GenerateStoreMetadata(Test.StoreMetadataFilters) .Where(x => x.Severity == System.Data.Metadata.Edm.EdmSchemaErrorSeverity.Error) .ToArray(); storeGenerator.WriteStoreSchema(@"c:\temp\" + name + ".ssdl"); //errors.HandleErrors(Strings.ReverseEngineer_SchemaError); var reader = XmlReader.Create(@"c:\temp\" + name + ".ssdl"); IList <EdmSchemaError> theErrors; var storeItemCollection = StoreItemCollection.Create(new[] { reader }, null, null, out theErrors); //var storeItemCollection = new System.Data.Metadata.Edm.StoreItemCollection(new[] { reader }); //var blahCC = new EntityModelSchemaGenerator(storeItemCollection, "My", "Default"); //blahCC.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); //blahCC.GenerateForeignKeyProperties = true; //blahCC.GenerateMetadata(); //MetadataWorkspace workspace = new MetadataWorkspace( // () => storeItemCollection, // null, // null); var blahB1 = storeItemCollection.GetEntityContainer("dboContainer"); var blahB2 = storeItemCollection.OfType <EntityType>().ToArray(); // Generate default mapping var contextName = "MyContext"; var modelGenerator = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", contextName); modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); modelGenerator.WriteModelSchema(@"C:\temp\" + name + ".csdl"); modelGenerator.WriteStorageMapping(@"c:\temp\" + name + ".msdl"); } // Pull out info about types to be generated //var entityTypes = modelGenerator.EdmItemCollection.OfType<EntityType>().ToArray(); //var mappings = new ReverseEngineerCodeFirstHandler.EdmMapping(modelGenerator, storeItemCollection); //var contextHost = new EfTextTemplateHost //{ // EntityContainer = modelGenerator.EntityContainer, // Namespace = "MyNamespace", // ModelsNamespace = "MyNamespace.Model", // MappingNamespace = "MyNamespace.Mapping", // EntityFrameworkVersion = new Version(5,0), //}; //var templateProcessor = new TemplateProcessor(); //var contextContents = templateProcessor.ProcessContext(contextHost); //foreach (var entityType in entityTypes) //{ // // Generate the code file // var entityHost = new EfTextTemplateHost // { // EntityType = entityType, // EntityContainer = modelGenerator.EntityContainer, // Namespace = "MyNamespace", // ModelsNamespace = "MyNamespace.Model", // MappingNamespace = "MyNamespace.Mapping", // EntityFrameworkVersion = new Version(5, 0), // TableSet = mappings.EntityMappings[entityType].Item1, // PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, // ManyToManyMappings = mappings.ManyToManyMappings // }; // var entityContents = templateProcessor.ProcessEntity(entityHost); //} //foreach (var entityType in entityTypes) //{ // var mappingHost = new EfTextTemplateHost // { // EntityType = entityType, // EntityContainer = modelGenerator.EntityContainer, // Namespace = "MyNamespace", // ModelsNamespace = "MyNamespace.Model", // MappingNamespace = "MyNamespace.Mapping", // EntityFrameworkVersion = new Version(5, 0), // TableSet = mappings.EntityMappings[entityType].Item1, // PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, // ManyToManyMappings = mappings.ManyToManyMappings // }; // var mappingContents = templateProcessor.ProcessMapping(mappingHost); //} //reverse.ReverseEngineerCodeFirst(); Assert.True(true); }
// 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); } } } }
public void ReverseEngineerCodeFirst() { try { // Find connection string and provider string connectionString = "data source=172.21.4.31,10086;initial catalog=Eme4;user id=eme;password=io77@68;MultipleActiveResultSets=True;App=EntityFramework""; var providerInvariant = "System.Data.SqlClient"; string projectNamespace = "TEST"; string currentDirectory = System.IO.Directory.GetCurrentDirectory(); DbConnection connection = new SqlConnection(connectionString); // Load store schema var storeGenerator = new EntityStoreSchemaGenerator(providerInvariant, connectionString, "dbo"); storeGenerator.GenerateForeignKeyProperties = true; var errors = storeGenerator.GenerateStoreMetadata(_storeMetadataFilters).Where(e => e.Severity == EdmSchemaErrorSeverity.Error); // Generate default mapping var contextName = connection.Database.Replace(" ", string.Empty).Replace(".", string.Empty) + "Context"; var modelGenerator = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", contextName); modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); // Pull out info about types to be generated var entityTypes = modelGenerator.EdmItemCollection.OfType <EntityType>().ToArray(); var mappings = new EdmMapping(modelGenerator, storeGenerator.StoreItemCollection); // Generate Entity Classes and Mappings var templateProcessor = new TemplateProcessor(); var modelsNamespace = projectNamespace + ".Models"; var modelsDirectory = Path.Combine(currentDirectory, "Models"); var mappingNamespace = modelsNamespace + ".Mapping"; var mappingDirectory = Path.Combine(modelsDirectory, "Mapping"); var entityFrameworkVersion = GetEntityFrameworkVersion(); foreach (var entityType in entityTypes) { // Generate the code file var entityHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = modelsNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var entityContents = templateProcessor.Process(Templates.EntityTemplate, entityHost); var filePath = Path.Combine(modelsDirectory, entityType.Name + entityHost.FileExtension); FileGenerator.AddNewFile(filePath, entityContents); var mappingHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = mappingNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var mappingContents = templateProcessor.Process(Templates.MappingTemplate, mappingHost); var mappingFilePath = Path.Combine(mappingDirectory, entityType.Name + "Map" + mappingHost.FileExtension); FileGenerator.AddNewFile(filePath, entityContents); } // Generate Context var contextHost = new EfTextTemplateHost { EntityContainer = modelGenerator.EntityContainer, Namespace = modelsNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion }; var contextContents = templateProcessor.Process(Templates.ContextTemplate, contextHost); var contextFilePath = Path.Combine(modelsDirectory, modelGenerator.EntityContainer.Name + contextHost.FileExtension); FileGenerator.AddNewFile(contextFilePath, contextContents); } catch (Exception exception) { } }
public void ReverseEngineerCodeFirstMain(Project project) { DebugCheck.NotNull(project); targetProject = project; try { var startTime = DateTime.Now; var _storeMetadataFilters = new List <EntityStoreSchemaFilterEntry> { new EntityStoreSchemaFilterEntry(null, null, "EdmMetadata", EntityStoreSchemaFilterObjectTypes.Table, EntityStoreSchemaFilterEffect.Exclude), new EntityStoreSchemaFilterEntry(null, null, "__MigrationHistory", EntityStoreSchemaFilterObjectTypes.Table, EntityStoreSchemaFilterEffect.Exclude), new EntityStoreSchemaFilterEntry(null, null, "sysdiagrams", EntityStoreSchemaFilterObjectTypes.Table, EntityStoreSchemaFilterEffect.Exclude), //new EntityStoreSchemaFilterEntry(null, null, null, EntityStoreSchemaFilterObjectTypes.View, EntityStoreSchemaFilterEffect.Exclude), new EntityStoreSchemaFilterEntry(null, null, null, EntityStoreSchemaFilterObjectTypes.Function, EntityStoreSchemaFilterEffect.Exclude) }; //build.txt不存在或者空文本生成所有实体,有文本按设置生成 var buildFilename = Path.Combine(targetProject.GetProjectDir(), "build.txt"); if (File.Exists(buildFilename)) { var content = File.ReadAllText(buildFilename); if (!string.IsNullOrWhiteSpace(content)) { var allowFilterEntrys = content.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) .Select(p => new EntityStoreSchemaFilterEntry(null, null, p, EntityStoreSchemaFilterObjectTypes.Table, EntityStoreSchemaFilterEffect.Allow)); _storeMetadataFilters.AddRange(allowFilterEntrys); } } var connectionStringSettings = DoConnectionStringSettings(targetProject); var entityFrameworkVersion = GetEntityFrameworkVersion(package, targetProject); // Load store schema var storeGenerator = new EntityStoreSchemaGenerator(connectionStringSettings.ProviderName, connectionStringSettings.ConnectionString, "dbo"); storeGenerator.GenerateForeignKeyProperties = true; var errors = storeGenerator.GenerateStoreMetadata(_storeMetadataFilters).Where(e => e.Severity == EdmSchemaErrorSeverity.Error); errors.HandleErrors(Strings.ReverseEngineer_SchemaError); if (storeGenerator.EntityContainer.BaseEntitySets == null || storeGenerator.EntityContainer.BaseEntitySets.Count() == 0) { package.LogError("生成中断,没有找到对应的表", new Exception("生成中断,没有找到对应的表")); return; } // Generate default mapping package.LogInfo(Strings.ReverseEngineer_GenerateMapping); var modelGenerator = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", connectionStringSettings.Name); modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); var entityTypes = modelGenerator.EdmItemCollection.OfType <EntityType>().ToArray(); EdmPropertyExtension.ColumnModels = new DocumentionExtension().GenerateDocumentation(entityTypes, connectionStringSettings); EntityTypeExtension.GetTableDescriptions(connectionStringSettings); var solutionProjects = targetProject.DTE.Solution.Projects.OfType <Project>(); Action <IEnumerable <Project> > loopProjectsAction = null; loopProjectsAction = projects => { foreach (var item in projects) { if (item.FullName.EndsWith(".csproj")) { ReverseEngineerCodeFirst(item, modelGenerator, entityTypes, storeGenerator.StoreItemCollection, entityFrameworkVersion); continue; } if (item.ProjectItems.Count > 0) { var subProjects = new List <Project>(); foreach (EnvDTE.ProjectItem subProject in item.ProjectItems) { subProjects.Add(subProject.SubProject); } loopProjectsAction(subProjects); } } }; loopProjectsAction(solutionProjects); var duration = DateTime.Now - startTime; package.LogInfo(Strings.ReverseEngineer_Complete(duration.ToString(@"h\:mm\:ss"))); } catch (Exception exception) { package.LogError(exception.Message, exception); } }
public void ReverseEngineerCodeFirst(Project project) { DebugCheck.NotNull(project); try { Stopwatch watcher = new Stopwatch(); watcher.Start(); string connectionString = string.Empty; string providerInvariant = string.Empty; string databaseName = string.Empty; bool isNewConnectionString = false; // Show available connection string var existingConnections = GetConnectionstrings(project); Connections connectionDialog = new Connections(existingConnections.Select(x => x.Name)); connectionDialog.ShowModal(); if (connectionDialog.IsConnectionStringSelected) { var selected = connectionDialog.SelectedConnectionString; var selectedConnectionSetting = existingConnections.First(x => x.Name.Equals(selected)); providerInvariant = selectedConnectionSetting.ProviderName; connectionString = selectedConnectionSetting.ConnectionString; var dbConnection = DbProviderFactories.GetFactory(providerInvariant).CreateConnection(); dbConnection.ConnectionString = connectionString; databaseName = dbConnection.Database; } else { // Show dialog with SqlClient selected by default var dialogFactory = _package.GetService <IVsDataConnectionDialogFactory>(); var dialog = dialogFactory.CreateConnectionDialog(); dialog.AddAllSources(); dialog.SelectedSource = new Guid("067ea0d9-ba62-43f7-9106-34930c60c528"); var dialogResult = dialog.ShowDialog(connect: true); if (dialogResult != null) { // Find connection string and provider var connection = (DbConnection)dialogResult.GetLockedProviderObject(); connectionString = connection.ConnectionString; var providerManager = (IVsDataProviderManager)Package.GetGlobalService(typeof(IVsDataProviderManager)); IVsDataProvider dp; providerManager.Providers.TryGetValue(dialogResult.Provider, out dp); providerInvariant = (string)dp.GetProperty("InvariantName"); databaseName = connection.Database; isNewConnectionString = true; } else { // User selected not to proceed by clicking cancel or closes window. return; } } // Load store schema _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_LoadingSchema; var storeGenerator = new EntityStoreSchemaGenerator(providerInvariant, connectionString, "dbo"); storeGenerator.GenerateForeignKeyProperties = true; var errors = storeGenerator.GenerateStoreMetadata(_storeMetadataFilters).Where(e => e.Severity == EdmSchemaErrorSeverity.Error); errors.HandleErrors(Strings.ReverseEngineer_SchemaError); // Generate default mapping _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_GenerateMapping; var contextName = databaseName.Replace(" ", string.Empty).Replace(".", string.Empty) + "Context"; var modelGenerator = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", contextName); modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); // Pull out info about types to be generated var entityTypes = modelGenerator.EdmItemCollection.OfType <EntityType>().ToArray(); var mappings = new EdmMapping(modelGenerator, storeGenerator.StoreItemCollection); // Find the project to add the code to var vsProject = (VSLangProj.VSProject)project.Object; var projectDirectory = new FileInfo(project.FileName).Directory; var defaultProjectNameSpace = (string)project.Properties.Item("RootNamespace").Value; var references = vsProject.References.Cast <VSLangProj.Reference>(); if (!references.Any(r => r.Name == "EntityFramework")) { // Add EF References _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_InstallEntityFramework; try { project.InstallPackage("EntityFramework"); } catch (Exception ex) { _package.LogError(Strings.ReverseEngineer_InstallEntityFrameworkError, ex); } } // Generate Entity Classes and Mappings var templateProcessor = new TemplateProcessor(project); var modelsNamespaceSuffixDefault = "Models"; var mappingNamespaceSuffixDefault = "Mappings"; var projectNamespace = defaultProjectNameSpace; var modelsNamespace = string.Concat(projectNamespace, ".", modelsNamespaceSuffixDefault); var mappingNamespace = string.Concat(modelsNamespace, ".", mappingNamespaceSuffixDefault); var modelsDirectory = projectDirectory.FullName; var mappingDirectory = projectDirectory.FullName; var contextDirectory = projectDirectory.FullName; var entityFrameworkVersion = GetEntityFrameworkVersion(references); ConcurrentDictionary <string, string> models = new ConcurrentDictionary <string, string>(); ConcurrentDictionary <string, string> maps = new ConcurrentDictionary <string, string>(); // Process the templates and generate content Parallel.ForEach(entityTypes, (entityType) => { _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_GenerateClasses(entityType.Name); var entityHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = projectNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var entityContents = templateProcessor.Process(Templates.EntityTemplate, entityHost); models.TryAdd(entityType.Name + entityHost.FileExtension, entityContents); var mappingHost = new EfTextTemplateHost { EntityType = entityType, EntityContainer = modelGenerator.EntityContainer, Namespace = projectNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion, TableSet = mappings.EntityMappings[entityType].Item1, PropertyToColumnMappings = mappings.EntityMappings[entityType].Item2, ManyToManyMappings = mappings.ManyToManyMappings }; var mappingContents = templateProcessor.Process(Templates.MappingTemplate, mappingHost); maps.TryAdd(entityType.Name + "Map" + mappingHost.FileExtension, mappingContents); }); // Generate Context _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_GenerateContext; var contextHost = new EfTextTemplateHost { EntityContainer = modelGenerator.EntityContainer, Namespace = projectNamespace, ModelsNamespace = modelsNamespace, MappingNamespace = mappingNamespace, EntityFrameworkVersion = entityFrameworkVersion }; var contextContents = templateProcessor.Process(Templates.ContextTemplate, contextHost); ProjectFilesPathGenUtility.SyncDirectoryWithNamespace( defaultProjectNameSpace, contextHost.Namespace, modelsNamespaceSuffixDefault, projectDirectory.FullName, ref contextDirectory); var contextFilePath = Path.Combine(contextDirectory, modelGenerator.EntityContainer.Name + contextHost.FileExtension); _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_AddingFiles; var contextItem = project.AddNewFile(contextFilePath, contextContents); // sync model directory ProjectFilesPathGenUtility.SyncDirectoryWithNamespace( defaultProjectNameSpace, contextHost.ModelsNamespace, modelsNamespaceSuffixDefault, projectDirectory.FullName, ref modelsDirectory); // Add models Parallel.ForEach(models, (file) => { project.AddNewFile(Path.Combine(modelsDirectory, file.Key), file.Value); }); // sync project mapping directory ProjectFilesPathGenUtility.SyncDirectoryWithNamespace( defaultProjectNameSpace, contextHost.MappingNamespace, mappingNamespaceSuffixDefault, projectDirectory.FullName, ref mappingDirectory); // Add mappings Parallel.ForEach(maps, (file) => { project.AddNewFile(Path.Combine(mappingDirectory, file.Key), file.Value); }); if (isNewConnectionString) { AddConnectionStringToConfigFile(project, connectionString, providerInvariant, modelGenerator.EntityContainer.Name); } if (contextItem != null) { // Open context class when done _package.DTE2.ItemOperations.OpenFile(contextFilePath); } watcher.Stop(); _package.DTE2.StatusBar.Text = Strings.ReverseEngineer_Complete((int)watcher.Elapsed.TotalSeconds); } catch (Exception exception) { _package.LogError(Strings.ReverseEngineer_Error, exception); } }
public void CodeGenerator(string connectionString, string projectNamespace, Action <string> action, List <string> selectedTables) { try { // Find connection string and provider var providerInvariant = "System.Data.SqlClient"; string currentDirectory = System.IO.Directory.GetCurrentDirectory(); using (DbConnection connection = new SqlConnection(connectionString)) { // Load store schema var storeGenerator = new EntityStoreSchemaGenerator(providerInvariant, connectionString, "dbo"); storeGenerator.GenerateForeignKeyProperties = true; var errors = storeGenerator.GenerateStoreMetadata(_storeMetadataFilters).Where(e => e.Severity == EdmSchemaErrorSeverity.Error); // Generate default mapping var contextName = connection.Database.Replace(" ", string.Empty).Replace(".", string.Empty) + "Context"; var modelGenerator = new EntityModelSchemaGenerator(storeGenerator.EntityContainer, "DefaultNamespace", contextName); modelGenerator.PluralizationService = PluralizationService.CreateService(new CultureInfo("en")); modelGenerator.GenerateForeignKeyProperties = true; modelGenerator.GenerateMetadata(); // Pull out info about types to be generated var entityTypes = modelGenerator.EdmItemCollection.OfType <EntityType>().ToArray().ToList(); var mappings = new EdmMapping(modelGenerator, storeGenerator.StoreItemCollection); var templateProcessor = new TemplateProcessor(); entityTypes = HandleCompletedRun(entityTypes, selectedTables); TemplateCommon.projectNamespace = projectNamespace; TemplateCommon.entityFrameworkVersion = GetEntityFrameworkVersion(); TemplateCommon.Init(); foreach (var entityType in entityTypes) { var entityName = entityType.Name.RemoveSpecialChar(); EntityTemplate entityTemplate = new EntityTemplate(entityType); entityTemplate.Generator(modelGenerator, templateProcessor, mappings); // Generate the map file new MappingTemplate(entityType).Generator(modelGenerator, templateProcessor, mappings); //Generate the repository file new RepositoryTemplate(entityType).Generator(modelGenerator, templateProcessor, mappings); //Generate the service file new ServiceTemplate(entityType).Generator(modelGenerator, templateProcessor, mappings); //Generate the svc file new SvcTemplate(entityType).Generator(modelGenerator, templateProcessor, mappings); //Generate the svc test file new SvcTestTemplate(entityType).Generator(modelGenerator, templateProcessor, mappings); } // Generate Context new ContextTemplate().Generator(modelGenerator, templateProcessor, mappings); if (action != null) { action("代码生成成功"); } } } catch (Exception exception) { if (action != null) { action(exception.Message); } } }
internal override bool Generate() { IList <EdmSchemaError> errors = null; // generate the SSDL string ssdlNamespace = _modelName + "Model.Store"; EntityStoreSchemaGenerator essg = new EntityStoreSchemaGenerator(ProviderName, _con.ConnectionString, ssdlNamespace); List <EntityStoreSchemaFilterEntry> filters = new List <EntityStoreSchemaFilterEntry>(); if (_tables != null && _tables.Count > 0) { foreach (var tablename in _tables) { filters.Add(new EntityStoreSchemaFilterEntry(null, null, tablename, EntityStoreSchemaFilterObjectTypes.Table, EntityStoreSchemaFilterEffect.Allow)); } } else { filters.Add(new EntityStoreSchemaFilterEntry(null, null, _table, EntityStoreSchemaFilterObjectTypes.Table, EntityStoreSchemaFilterEffect.Allow)); } filters.Add(new EntityStoreSchemaFilterEntry(null, null, "%", EntityStoreSchemaFilterObjectTypes.View, EntityStoreSchemaFilterEffect.Exclude)); Version entityVersion = new Version(2, 0, 0, 0); #if NET_40_OR_GREATER errors = essg.GenerateStoreMetadata(filters, entityVersion); #else errors = essg.GenerateStoreMetadata(filters); #endif // write out errors if ((errors != null && errors.Count > 0)) { WriteErrors(errors); SendErrorsToGeneralOuput(); } // write the SSDL to a string StringWriter ssdl = new StringWriter(); XmlWriter ssdlxw = XmlWriter.Create(ssdl); essg.WriteStoreSchema(ssdlxw); ssdlxw.Flush(); // generate the CSDL string csdlNamespace = _artifactNamespace; string csdlEntityContainerName = _modelName + "Entities"; EntityModelSchemaGenerator emsg = new EntityModelSchemaGenerator(essg.EntityContainer, csdlNamespace, csdlEntityContainerName); #if NET_40_OR_GREATER emsg.GenerateForeignKeyProperties = true; errors = emsg.GenerateMetadata(entityVersion); #else errors = emsg.GenerateMetadata(); #endif // write out errors if ((errors != null && errors.Count > 0)) { WriteErrors(errors); SendErrorsToGeneralOuput(); } // write CSDL to a string StringWriter csdl = new StringWriter(); XmlWriter csdlxw = XmlWriter.Create(csdl); emsg.WriteModelSchema(csdlxw); csdlxw.Flush(); // write MSL to a string StringWriter msl = new StringWriter(); XmlWriter mslxw = XmlWriter.Create(msl, new XmlWriterSettings() { }); emsg.WriteStorageMapping(mslxw); mslxw.Flush(); // Write everything + glue xml to file string file = Path.Combine(_path, _modelName + ".edmx"); string sCsdl = csdl.ToString(); string sSsdl = ssdl.ToString(); string sMsl = msl.ToString(); sCsdl = sCsdl.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", ""); sSsdl = sSsdl.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", ""); sMsl = sMsl.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", ""); FileInfo fi = new FileInfo(file); WriteEdmx(sCsdl, sSsdl, sMsl, fi); if (_mappings != null && _mappings.Count != 0) { GetColumnMappings(fi); } AddToProject(fi.FullName); if (_warnings.Count > 0) { SendErrorsToGeneralOuput(); _tablesIncluded = GetTablesInModel(fi.FullName); } else { _tablesIncluded = _tables; } return(true); }