Ejemplo n.º 1
0
        public async Task UpdateAsync(SqlServerSpatialDbContext context)
        {
            await EnsureMetadataTablesCreated(context);

            const int geometryColumnType = 32;

            var coordinateSystemSubquery = $"(select csguid from GCoordSystem where name = '{Settings.CoordinateSystemName}')";
            var spatialReferenceId       = Settings.SpatialReferenceId;

            var sql      = new StringBuilder();
            var entities = SqlServerSpatialColumn.GetSpatialColumns(context.Model);

            foreach (var(entity, column, geometryType) in entities)
            {
                var tableName         = entity.SqlServer().TableName;
                var columnName        = column.Name;
                var geometryTypeValue = GetGeoMediaDataSubType(geometryType);

                // Remove any existing metadata
                sql.AppendLine($"delete from GFeatures where FeatureName = '{tableName}'");
                sql.AppendLine($"delete from GFieldMapping where TABLE_NAME = '{tableName}'");

                // Insert metadata
                var geoMediaSpatialColumnName = GetGeoMediaSpatialColumnName(columnName);
                sql.AppendLine($"insert into GFeatures values ('{tableName}', {geometryTypeValue}, '{geoMediaSpatialColumnName}', '')");
                sql.AppendLine($"insert into GFieldMapping values('{tableName}', '{geoMediaSpatialColumnName}', {geometryColumnType}, {geometryTypeValue}, {coordinateSystemSubquery}, null, '{columnName}', {spatialReferenceId})");

                sql.AppendLine();
            }

            var sqlText = sql.ToString();
            await context.Database.ExecuteSqlCommandAsync(sqlText);
        }
Ejemplo n.º 2
0
        private async Task EnsureMetadataTablesCreated(SqlServerSpatialDbContext context)
        {
            // Check if metadata objects already exist
            using (var cmd = context.Database.GetDbConnection().CreateCommand())
            {
                cmd.CommandText = "select count(*) from sys.tables where name = 'GFeatures' and type = 'U'";
                await context.Database.OpenConnectionAsync();

                try
                {
                    var metadataExists = 1 == (int)(await cmd.ExecuteScalarAsync());
                    if (metadataExists)
                    {
                        return;
                    }
                }
                finally
                {
                    context.Database.CloseConnection();
                }
            }

            // Create metadata objects starting with the GeoMedia metadata script (created by SSMS)
            var type = GetType();
            var ddl  = await Resources.ReadResourceAsync($"{type.Namespace}.Resources.MetadataDDL.sql", type.Assembly);

            var cmds = ddl
                       .Split(new[] { "GO\r\n", "GO\n" }, StringSplitOptions.None)
                       .Where(cmd => !cmd.StartsWith("USE ") && !string.IsNullOrWhiteSpace(cmd))
                       .ToList();

            AppendCoordinateSystemData(cmds);

            // Executre each command in sequence
            foreach (var cmd in cmds)
            {
                try
                {
                    await context.Database.ExecuteSqlCommandAsync(cmd);
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException($"Error executing GeoMedia metadata DDL cmd: {cmd}", ex);
                }
            }
        }