示例#1
0
        /*
         *
         * CREATE DATABASE sandbox;
         * CREATE SCHEMA dappercustomtypestuff;
         *
         * CREATE SEQUENCE dappercustomtypestuff.location_id_seq
         * AS INTEGER
         * MAXVALUE 2147483647;
         *
         * CREATE SEQUENCE dappercustomtypestuff.location_active_id_seq
         * AS INTEGER
         * MAXVALUE 2147483647;
         *
         * CREATE TYPE dappercustomtypestuff.ID_DATE AS
         * (
         * id   INTEGER,
         * date TIMESTAMP
         * );
         *
         * CREATE TABLE dappercustomtypestuff.location
         * (
         * id   SERIAL NOT NULL
         * CONSTRAINT location_pkey
         * PRIMARY KEY,
         * name TEXT   NOT NULL
         * );
         *
         * CREATE TABLE dappercustomtypestuff.location_active
         * (
         * id         SERIAL NOT NULL
         * CONSTRAINT location_active_pkey
         * PRIMARY KEY,
         * locationid INTEGER
         * CONSTRAINT fk_location_active_location_id
         * REFERENCES location,
         * start      TIMESTAMP,
         * "end"      TIMESTAMP
         * );
         *
         * insert into location (name) values ('location 1');
         * insert into location (name) values ('location 2');
         * insert into location (name) values ('location 3');
         *
         * insert into location_active (locationid, start, "end") values (1, '2018-01-01', '2018-01-15');
         * insert into location_active (locationid, start, "end") values (1, '2018-01-20', '2018-01-25');
         * insert into location_active (locationid, start, "end") values (2, '2018-01-01', '2018-01-05');
         * insert into location_active (locationid, start, "end") values (3, '2018-02-01', '2018-02-10');
         *
         */

        public SomePostgresCustomTypeStuff() : base("sandbox", "dappercustomtypestuff")
        {
            var npgsqlSnakeCaseNameTranslator = new NpgsqlSnakeCaseNameTranslator();

            SqlMapper.AddTypeHandler(new IdDateTypeHandler());
            NpgsqlConnection.GlobalTypeMapper.MapComposite <IdDate>("dappercustomtypestuff.id_date", npgsqlSnakeCaseNameTranslator);
        }
示例#2
0
        public static ModelBuilder UseSnakeCaseNamingConvention(this ModelBuilder modelBuilder)
        {
            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                entity.SetTableName(NpgsqlSnakeCaseNameTranslator.ConvertToSnakeCase(entity.ClrType.Name));

                foreach (var property in entity.GetProperties())
                {
                    property.SetColumnName(NpgsqlSnakeCaseNameTranslator.ConvertToSnakeCase(property.GetColumnName()));
                }
            }

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var key in entity.GetKeys())
                {
                    key.SetName(GetDefaultName(key));
                }

                foreach (var key in entity.GetForeignKeys())
                {
                    key.SetConstraintName(GetDefaultName(key));
                }

                foreach (var index in entity.GetIndexes())
                {
                    index.SetName(GetDefaultName(index));
                }
            }

            return(modelBuilder);
        }
示例#3
0
        public void FixSnakeCaseNames(ModelBuilder modelBuilder)
        {
            var mapper = new NpgsqlSnakeCaseNameTranslator();

            foreach (var table in modelBuilder.Model.GetEntityTypes())
            {
                ConvertToSnake(mapper, table);
                foreach (var property in table.GetProperties())
                {
                    ConvertToSnake(mapper, property);

                    if (property.ClrType == typeof(string))
                    {
                        property.SetColumnType("varchar(100)");
                    }
                }

                foreach (var primaryKey in table.GetKeys())
                {
                    ConvertToSnake(mapper, primaryKey);
                }

                foreach (var foreignKey in table.GetForeignKeys())
                {
                    ConvertToSnake(mapper, foreignKey);
                }

                foreach (var indexKey in table.GetIndexes())
                {
                    ConvertToSnake(mapper, indexKey);
                }
            }
        }
示例#4
0
        private void FixSnakeCaseNames(ModelBuilder modelBuilder)
        {
            var mapper = new NpgsqlSnakeCaseNameTranslator();

            foreach (var table in modelBuilder.Model.GetEntityTypes())
            {
                ConvertToSnake(mapper, table);
                foreach (var property in table.GetProperties())
                {
                    ConvertToSnake(mapper, property);
                }

                foreach (var primaryKey in table.GetKeys())
                {
                    ConvertToSnake(mapper, primaryKey);
                }

                foreach (var foreignKey in table.GetForeignKeys())
                {
                    ConvertToSnake(mapper, foreignKey);
                }

                foreach (var indexKey in table.GetIndexes())
                {
                    ConvertToSnake(mapper, indexKey);
                }
            }
        }
示例#5
0
    NpgsqlConnection OpenAndMapComposite <T>(T composite, string?schema, string nameSuffix, out string nameQualified)
        where T : IComposite
    {
        var nameTranslator = new NpgsqlSnakeCaseNameTranslator();
        var name           = nameTranslator.TranslateTypeName(typeof(T).Name + nameSuffix);

        if (schema == null)
        {
            nameQualified = name;
        }
        else
        {
            schema        = nameTranslator.TranslateTypeName(schema);
            nameQualified = schema + "." + name;
        }

        var connection = OpenConnection();

        try
        {
            connection.ExecuteNonQuery(schema is null ? $"DROP TYPE IF EXISTS {name}" : $"DROP SCHEMA IF EXISTS {schema} CASCADE; CREATE SCHEMA {schema}");
            connection.ExecuteNonQuery($"CREATE TYPE {nameQualified} AS ({composite.GetAttributes()})");

            connection.ReloadTypes();
            connection.TypeMapper.MapComposite <T>(nameQualified, nameTranslator);

            return(connection);
        }
        catch
        {
            connection.Dispose();
            throw;
        }
    }
        public static void ApplyToModelBuilder(DatabaseFacade databaseFacade, ModelBuilder modelBuilder)
        {
            switch (DbProvider)
            {
            case DbProvider.SqlServer:
                break;

            case DbProvider.Sqlite:
            default:
                var mapper = new NpgsqlSnakeCaseNameTranslator();
                foreach (var entity in modelBuilder.Model.GetEntityTypes())
                {
                    foreach (var property in entity.GetProperties())
                    {
                        var storeObjectIdentifier = StoreObjectIdentifier.Create(property.DeclaringEntityType, StoreObjectType.Table);
                        if (storeObjectIdentifier.HasValue)
                        {
                            property.SetColumnName(mapper.TranslateMemberName(property.GetColumnName(storeObjectIdentifier.Value)));
                        }
                    }

                    entity.SetTableName(mapper.TranslateTypeName(entity.GetTableName()));
                }
                break;
            }
        }
示例#7
0
        public static IQueryable <TEntity> FromView <TEntity>(this DbSet <TEntity> dbSet, string viewName)
            where TEntity : class
        {
            var mapper = new NpgsqlSnakeCaseNameTranslator();

            return(dbSet.FromSql($"select * from {mapper.TranslateTypeName(viewName)}"));
        }
示例#8
0
        public void SnakeCaseTest_Many()
        {
            var testVals = GetTestVals();

            foreach (var testVal in testVals)
            {
                var trans = new NpgsqlSnakeCaseNameTranslator();

                Assert.AreEqual(testVal.Item2, testVal.Item1.ToSnakeCase());
            }
        }
示例#9
0
        public void SnakeCaseTest_ManyWithNpgsql()
        {
            var testVals = GetTestVals();

            foreach (var testVal in testVals)
            {
                var trans = new NpgsqlSnakeCaseNameTranslator(false);

                Assert.AreEqual(testVal.Item2, trans.TranslateMemberName(testVal.Item1));
            }
        }
示例#10
0
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            if (modelBuilder == null)
            {
                return;
            }

            var mapper = new NpgsqlSnakeCaseNameTranslator();

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entity.GetProperties())
                {
                    modelBuilder.Entity(entity.Name).Property(property.Name).HasColumnName(mapper.TranslateMemberName(property.Name)); //.ToTable(mapper.TranslateMemberName(entity.Name));
                    //property.Relational().ColumnName = mapper.TranslateMemberName(property.Name);
                }

                //entity.Relational().TableName = mapper.TranslateMemberName(entity.Relational().TableName);
                modelBuilder.Entity(entity.Name).ToTable(mapper.TranslateMemberName(entity.GetTableName()));
            }

            modelBuilder.Entity <Project>(p =>
            {
                p.HasOne(p => p.Creator).WithMany(du => du.CreatedProjects);
                p.HasOne(p => p.Owner).WithMany(du => du.OwnedProjects);
                p.HasIndex(p => new { p.Name, p.CreatorId }).IsUnique();
            });

            modelBuilder.Entity <PostTag>().Ignore(x => x.Post).HasKey(x => new { x.PostId, x.TagName });

            modelBuilder.Entity <ProjectAdmin>(pa =>
            {
                pa.HasKey(t => new { t.ProjectId, t.AdminId });
                pa.HasOne(pa => pa.Project).WithMany(a => a.Admins).HasForeignKey(pa => pa.ProjectId);
                pa.HasOne(pa => pa.Admin).WithMany(p => p.AdminedProjects).HasForeignKey(pa => pa.AdminId);
            });

            modelBuilder.Entity <ProjectMaintainer>(pm =>
            {
                pm.HasKey(t => new { t.ProjectId, t.MaintainerId });
                pm.HasOne(pm => pm.Project).WithMany(a => a.Maintainers).HasForeignKey(pm => pm.ProjectId);
                pm.HasOne(pm => pm.Maintainer).WithMany(p => p.MaintainedProjects).HasForeignKey(pm => pm.MaintainerId);
            });
            modelBuilder.Entity <IssueIssueType>(iit =>
            {
                iit.HasKey(t => new { t.IssueId, t.IssueTypeId });
                iit.HasOne(pi => pi.Issue).WithMany(i => i.Types).HasForeignKey(pi => pi.IssueId);
                iit.HasOne(pi => pi.IssueType).WithMany(it => it.Issues).HasForeignKey(pi => pi.IssueTypeId);
            });
        }
示例#11
0
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var mapper = new NpgsqlSnakeCaseNameTranslator();
            var types  = modelBuilder.Model.GetEntityTypes().ToList();

            // Refer to tables in snake_case internally
            types.ForEach(e => e.Relational().TableName = mapper.TranslateMemberName(e.Relational().TableName));

            // Refer to columns in snake_case internally
            types.SelectMany(e => e.GetProperties())
            .ToList()
            .ForEach(p => p.Relational().ColumnName = mapper.TranslateMemberName(p.Relational().ColumnName));
        }
示例#12
0
        public static void PostgresModelCreating(this ModelBuilder builder)
        {
            var mapper = new NpgsqlSnakeCaseNameTranslator();

            foreach (var entity in builder.Model.GetEntityTypes())
            {
                // modify column names
                foreach (var property in entity.GetProperties())
                {
                    property.SetColumnName(mapper.TranslateMemberName(property.GetColumnName(StoreObjectIdentifier.Table(entity.GetTableName(), null))));
                }

                // modify table name
                entity.SetTableName(mapper.TranslateMemberName(entity.GetTableName()));

                // modify keys names
                foreach (var key in entity.GetKeys())
                {
                    key.SetName(mapper.TranslateMemberName(key.GetName()));
                }

                // modify foreign keys names
                foreach (var key in entity.GetForeignKeys())
                {
                    key.SetConstraintName(mapper.TranslateMemberName(key.GetConstraintName()));
                }

                // modify indexes names
                foreach (var index in entity.GetIndexes())
                {
                    index.SetDatabaseName(mapper.TranslateMemberName(index.GetDatabaseName()));
                }

                // move asp_net tables into schema 'identity'
                if (entity.GetTableName().StartsWith("asp_net_"))
                {
                    entity.SetTableName(entity.GetTableName().Replace("asp_net_", string.Empty));
                    entity.SetSchema("identity");
                }
            }
        }
        public static void ApplyToModelBuilder(DatabaseFacade databaseFacade, ModelBuilder modelBuilder)
        {
            switch (DbProvider)
            {
            case DbProvider.SqlServer:
                break;

            case DbProvider.Sqlite:
            default:
                var mapper = new NpgsqlSnakeCaseNameTranslator();
                foreach (var entity in modelBuilder.Model.GetEntityTypes())
                {
                    foreach (var property in entity.GetProperties())
                    {
                        property.SetColumnName(mapper.TranslateMemberName(property.GetColumnName()));
                    }

                    entity.SetTableName(mapper.TranslateTypeName(entity.GetTableName()));
                }
                break;
            }
        }
示例#14
0
        private void ApplySnakeCaseNames(ModelBuilder modelBuilder)
        {
            var mapper = new NpgsqlSnakeCaseNameTranslator();

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                // modify column names
                foreach (var property in entity.GetProperties())
                {
                    property.SetColumnName(mapper.TranslateMemberName(property.GetColumnName()));
                }

                // modify table name
                entity.SetTableName(mapper.TranslateMemberName(entity.GetTableName()));

                // move asp_net tables into schema 'identity'
                if (entity.GetTableName().StartsWith("asp_net_"))
                {
                    entity.SetTableName(entity.GetTableName().Replace("asp_net_", string.Empty));
                    entity.SetSchema("identity");
                }
            }
        }
示例#15
0
        public static void ApplySnakeCaseNames(this ModelBuilder modelBuilder)
        {
            var mapper = new NpgsqlSnakeCaseNameTranslator();

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                // modify column names
                foreach (var property in entity.GetProperties())
                {
                    property.Relational().ColumnName = mapper.TranslateMemberName(property.Relational().ColumnName);
                }

                // modify table name
                entity.Relational().TableName = mapper.TranslateMemberName(entity.Relational().TableName);

                // move asp_net tables into schema 'identity'
                if (!entity.Relational().TableName.StartsWith("asp_net_"))
                {
                    continue;
                }
                entity.Relational().TableName = entity.Relational().TableName.Replace("asp_net_", string.Empty);
                entity.Relational().Schema    = "identity";
            }
        }
 internal GlobalTypeMapper()
 {
     Mappings = new Dictionary <string, NpgsqlTypeMapping>();
     DefaultNameTranslator = new NpgsqlSnakeCaseNameTranslator();
 }
示例#17
0
 public static string ToSnakeCase(this string input) => NpgsqlSnakeCaseNameTranslator.ConvertToSnakeCase(input);