Exemple #1
0
        public void GenerateFluentApi_identity_sequence_options()
        {
            var generator    = new NpgsqlAnnotationCodeGenerator(new AnnotationCodeGeneratorDependencies());
            var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

            modelBuilder.Entity(
                "Post",
                x =>
            {
                x.Property <int>("Id")
                .UseIdentityByDefaultColumn()
                .HasIdentityOptions(
                    startValue: 5,
                    incrementBy: 2,
                    minValue: 3,
                    maxValue: 2000,
                    isCyclic: true,
                    numbersToCache: 10);
            });

            var property = modelBuilder.Model.FindEntityType("Post").GetProperties()
                           .Single(p => p.Name == "Id");
            var annotation = property.FindAnnotation(NpgsqlAnnotationNames.IdentityOptions);

            Assert.False(generator.IsHandledByConvention(property, annotation));
            var result = generator.GenerateFluentApi(property, annotation);

            Assert.Equal(nameof(NpgsqlPropertyBuilderExtensions.HasIdentityOptions), result.Method);
            Assert.Equal(5L, result.Arguments[0]);
            Assert.Equal(2L, result.Arguments[1]);
            Assert.Equal(3L, result.Arguments[2]);
            Assert.Equal(2000L, result.Arguments[3]);
            Assert.Equal(true, result.Arguments[4]);
            Assert.Equal(10L, result.Arguments[5]);
        }
        private static DbCompiledModelInfo BuildDbCompiledModelInfo(string nameOrConStr, DatabaseType dbType)
        {
            lock (_buildCompiledModelLock)
            {
                ConventionSet conventionSet = null;
                switch (dbType)
                {
                case DatabaseType.SqlServer: conventionSet = SqlServerConventionSetBuilder.Build(); break;

                case DatabaseType.MySql: conventionSet = MySqlConventionSetBuilder.Build(); break;

                case DatabaseType.PostgreSql: conventionSet = NpgsqlConventionSetBuilder.Build(); break;

                case DatabaseType.Oracle: conventionSet = OracleConventionSetBuilder.Build(); break;

                default: throw new Exception("暂不支持该数据库!");
                }
                ModelBuilder modelBuilder = new ModelBuilder(conventionSet);
                _modelTypeMap.Values.ForEach(x =>
                {
                    modelBuilder.Model.AddEntityType(x);
                });

                DbCompiledModelInfo newInfo = new DbCompiledModelInfo
                {
                    ConStr       = nameOrConStr,
                    DatabaseType = dbType,
                    Model        = modelBuilder.FinalizeModel()
                };
                return(newInfo);
            }
        }
Exemple #3
0
        private static IModel BuildDbCompiledModel(DatabaseType dbType)
        {
            ConventionSet conventionSet = null;

            switch (dbType)
            {
            case DatabaseType.SqlServer: conventionSet = SqlServerConventionSetBuilder.Build(); break;

            case DatabaseType.MySql: conventionSet = MySqlConventionSetBuilder.Build(); break;

            case DatabaseType.PostgreSql: conventionSet = NpgsqlConventionSetBuilder.Build(); break;

            case DatabaseType.Oracle: conventionSet = OracleConventionSetBuilder.Build(); break;

            default: throw new Exception("暂不支持该数据库!");
            }
            ModelBuilder modelBuilder = new ModelBuilder(conventionSet);

            _entityTypeMap.Values.ForEach(x =>
            {
                modelBuilder.Model.AddEntityType(x);
            });

            return(modelBuilder.FinalizeModel());
        }
Exemple #4
0
    public void Extension_with_null_schema()
    {
        var generator    = CreateGenerator();
        var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

        modelBuilder.HasPostgresExtension(null, "postgis");

        var model       = (IModel)modelBuilder.Model;
        var annotations = model.GetAnnotations().ToDictionary(a => a.Name, a => a);
        var result      = generator.GenerateFluentApiCalls(model, annotations)
                          .Single(c => c.Method == nameof(NpgsqlModelBuilderExtensions.HasPostgresExtension));

        Assert.Collection(result.Arguments, name => Assert.Equal("postgis", name));
    }
Exemple #5
0
        public void GenerateFluentApi_value_generation()
        {
            var generator    = CreateGenerator();
            var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

            modelBuilder.Entity(
                "Post",
                x =>
            {
                x.Property <int>("IdentityByDefault").UseIdentityByDefaultColumn();
                x.Property <int>("IdentityAlways").UseIdentityAlwaysColumn();
                x.Property <int>("Serial").UseSerialColumn();
            });

            // Note: both serial and identity-by-default columns are considered by-convention - we don't want
            // to assume that the PostgreSQL version of the scaffolded database necessarily determines the
            // version of the database that the scaffolded model will target. This makes life difficult for
            // models with mixed strategies but that's an edge case.

            var entity = modelBuilder.Model.FindEntityType("Post");

            var property    = entity.GetProperties().Single(p => p.Name == "IdentityByDefault");
            var annotations = property.GetAnnotations().ToDictionary(a => a.Name, a => a);

            generator.RemoveAnnotationsHandledByConventions(property, annotations);
            Assert.Empty(annotations);
            var result = generator.GenerateFluentApiCalls(property, property.GetAnnotations().ToDictionary(a => a.Name, a => a))
                         .Single();

            Assert.Equal(nameof(NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn), result.Method);
            Assert.Equal(0, result.Arguments.Count);

            property    = entity.GetProperties().Single(p => p.Name == "IdentityAlways");
            annotations = property.GetAnnotations().ToDictionary(a => a.Name, a => a);
            generator.RemoveAnnotationsHandledByConventions(property, annotations);
            Assert.Contains(annotations, kv => kv.Key == NpgsqlAnnotationNames.ValueGenerationStrategy);
            result = generator.GenerateFluentApiCalls(property, annotations).Single();
            Assert.Equal(nameof(NpgsqlPropertyBuilderExtensions.UseIdentityAlwaysColumn), result.Method);
            Assert.Equal(0, result.Arguments.Count);

            property    = entity.GetProperties().Single(p => p.Name == "Serial");
            annotations = property.GetAnnotations().ToDictionary(a => a.Name, a => a);
            generator.RemoveAnnotationsHandledByConventions(property, annotations);
            Assert.Empty(annotations);
            result = generator.GenerateFluentApiCalls(property, property.GetAnnotations().ToDictionary(a => a.Name, a => a))
                     .Single();
            Assert.Equal(nameof(NpgsqlPropertyBuilderExtensions.UseSerialColumn), result.Method);
            Assert.Equal(0, result.Arguments.Count);
        }
Exemple #6
0
    public void GenerateFluentApi_IModel_works_with_IdentityAlways()
    {
        var generator    = CreateGenerator();
        var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

        modelBuilder.UseIdentityAlwaysColumns();

        var annotations = modelBuilder.Model.GetAnnotations().ToDictionary(a => a.Name, a => a);
        var result      = generator.GenerateFluentApiCalls(((IModel)modelBuilder.Model), annotations).Single();

        Assert.Equal("UseIdentityAlwaysColumns", result.Method);
        Assert.Equal("NpgsqlModelBuilderExtensions", result.DeclaringType);

        Assert.Empty(result.Arguments);
    }
Exemple #7
0
    public void Range()
    {
        var generator    = CreateGenerator();
        var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

        modelBuilder.HasPostgresRange("some_range", "some_subtype");

        var model       = (IModel)modelBuilder.Model;
        var annotations = model.GetAnnotations().ToDictionary(a => a.Name, a => a);
        var result      = generator.GenerateFluentApiCalls(model, annotations)
                          .Single(c => c.Method == nameof(NpgsqlModelBuilderExtensions.HasPostgresRange));

        Assert.Collection(result.Arguments,
                          name => Assert.Equal("some_range", name),
                          subtype => Assert.Equal("some_subtype", subtype));
    }
Exemple #8
0
    public void GenerateFluentApi_IProperty_works_with_IdentityAlways()
    {
        var generator    = CreateGenerator();
        var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

        modelBuilder.Entity("Post", x => x.Property <int>("Id").UseIdentityAlwaysColumn());
        var property = (IProperty)modelBuilder.Model.FindEntityType("Post").FindProperty("Id");

        var annotations = property.GetAnnotations().ToDictionary(a => a.Name, a => a);
        var result      = generator.GenerateFluentApiCalls(property, annotations).Single();

        Assert.Equal("UseIdentityAlwaysColumn", result.Method);
        Assert.Equal("NpgsqlPropertyBuilderExtensions", result.DeclaringType);

        Assert.Empty(result.Arguments);
    }
Exemple #9
0
        private IModel BuildDbCompiledModel()
        {
            if (ModelTypeMap.Count == 0)
            {
                InitModelType();
            }
#pragma warning disable EF1001 // Internal EF Core API usage.
            ConventionSet conventionSet = NpgsqlConventionSetBuilder.Build();
#pragma warning restore EF1001 // Internal EF Core API usage.
            ModelBuilder modelBuilder = new ModelBuilder(conventionSet);
            ModelTypeMap.Values.ForEach(x =>
            {
                modelBuilder.Model.AddEntityType(x);
            });
            return(modelBuilder.FinalizeModel());
        }
Exemple #10
0
        public void GenerateFluentApi_IModel_works_with_HiLo()
        {
            var generator    = CreateGenerator();
            var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

            modelBuilder.UseHiLo("HiLoIndexName", "HiLoIndexSchema");

            var annotations = modelBuilder.Model.GetAnnotations().ToDictionary(a => a.Name, a => a);
            var result      = generator.GenerateFluentApiCalls(modelBuilder.Model, annotations).Single();

            Assert.Equal("UseHiLo", result.Method);

            Assert.Collection(
                result.Arguments,
                name => Assert.Equal("HiLoIndexName", name),
                schema => Assert.Equal("HiLoIndexSchema", schema));
        }
Exemple #11
0
    public void Enum_with_null_schema()
    {
        var generator    = CreateGenerator();
        var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

        var enumLabels = new[] { "someValue1", "someValue2" };

        modelBuilder.HasPostgresEnum(schema: null, "some_enum", enumLabels);

        var model       = (IModel)modelBuilder.Model;
        var annotations = model.GetAnnotations().ToDictionary(a => a.Name, a => a);
        var result      = generator.GenerateFluentApiCalls(model, annotations)
                          .Single(c => c.Method == nameof(NpgsqlModelBuilderExtensions.HasPostgresEnum));

        Assert.Collection(result.Arguments,
                          name => Assert.Equal("some_enum", name),
                          labels => Assert.Equal(enumLabels, labels));
    }
Exemple #12
0
        public void GenerateFluentApi_IProperty_works_with_HiLo()
        {
            var generator    = CreateGenerator();
            var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

            modelBuilder.Entity("Post", x => x.Property <int>("Id").UseHiLo("HiLoIndexName", "HiLoIndexSchema"));
            var property = modelBuilder.Model.FindEntityType("Post").FindProperty("Id");

            var annotations = property.GetAnnotations().ToDictionary(a => a.Name, a => a);
            var result      = generator.GenerateFluentApiCalls(property, annotations).Single();

            Assert.Equal("UseHiLo", result.Method);

            Assert.Collection(
                result.Arguments,
                name => Assert.Equal("HiLoIndexName", name),
                schema => Assert.Equal("HiLoIndexSchema", schema));
        }
Exemple #13
0
        public void GenerateFluentApi_identity()
        {
            var generator    = new NpgsqlAnnotationCodeGenerator(new AnnotationCodeGeneratorDependencies());
            var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

            modelBuilder.Entity(
                "Post",
                x =>
            {
                x.Property <int>("Id").UseNpgsqlIdentityAlwaysColumn();
            });
            var property   = modelBuilder.Model.FindEntityType("Post").GetProperties().Single();
            var annotation = property.FindAnnotation(NpgsqlAnnotationNames.ValueGenerationStrategy);

            var result = generator.GenerateFluentApi(property, annotation);

            Assert.Equal("UseNpgsqlIdentityAlwaysColumn", result.Method);

            Assert.Equal(0, result.Arguments.Count);
        }
Exemple #14
0
    public void GenerateFluentApi_identity_sequence_options()
    {
        var generator    = CreateGenerator();
        var modelBuilder = new ModelBuilder(NpgsqlConventionSetBuilder.Build());

        modelBuilder.Entity(
            "Post",
            x =>
        {
            x.Property <int>("Id")
            .UseIdentityByDefaultColumn()
            .HasIdentityOptions(
                startValue: 5,
                incrementBy: 2,
                minValue: 3,
                maxValue: 2000,
                cyclic: true,
                numbersToCache: 10);
        });

        var property = (IProperty)modelBuilder.Model.FindEntityType("Post").GetProperties()
                       .Single(p => p.Name == "Id");
        var annotations = property.GetAnnotations().ToDictionary(a => a.Name, a => a);

        generator.RemoveAnnotationsHandledByConventions(property, annotations);
        Assert.Contains(annotations, kv => kv.Key == NpgsqlAnnotationNames.IdentityOptions);
        var result = generator.GenerateFluentApiCalls(property, annotations).Single();

        Assert.Equal(nameof(NpgsqlPropertyBuilderExtensions.HasIdentityOptions), result.Method);
        Assert.Equal(5L, result.Arguments[0]);
        Assert.Equal(2L, result.Arguments[1]);
        Assert.Equal(3L, result.Arguments[2]);
        Assert.Equal(2000L, result.Arguments[3]);
        Assert.Equal(true, result.Arguments[4]);
        Assert.Equal(10L, result.Arguments[5]);
    }
        public virtual MappingInfo GetMappingInfo()
        {
            return(_cache.GetOrAdd(GetCacheKey(), a =>
            {
                var _schema = _schemaProvider.GetSchema();
                _mappingResolver = new MappingResolver(_schema);
                ConventionSet conventionSet;
                if (_schema.Schema.DBType == DatabaseType.Postgres)
                {
                    conventionSet = NpgsqlConventionSetBuilder.Build();
                }
                else
                {
                    conventionSet = SqlServerConventionSetBuilder.Build();
                }
                var builder = new ModelBuilder(conventionSet);
                OnModelCreating(builder);
                builder.FinalizeModel();

                return new Lazy <MappingInfo>(
                    () => new MappingInfo(builder.Model, _schema),
                    LazyThreadSafetyMode.ExecutionAndPublication);
            }).Value);
        }
Exemple #16
0
 public override ModelBuilder GetModelBuilder() => new ModelBuilder(NpgsqlConventionSetBuilder.Build());