From 39b3e3844eb8cf1c91afcad4da04a93361930846 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 1 Jul 2016 18:57:55 +0000 Subject: [PATCH 01/12] Properly support PG extensions in migrations Migrations can now contain CreatePostgresExtension() and DropPostgresExtension(). Fixes #58 (cherry picked from commit 8f2267b91c21ed1fa5f4924fd08138ccb0c3e953) --- ...NpgsqlCSharpMigrationOperationGenerator.cs | 102 ++++++++++++++++++ ...tityFrameworkCore.PostgreSQL.Design.csproj | 3 +- ...ameworkCore.PostgreSQL.Design.project.json | 1 + .../NpgsqlDesignTimeServices.cs | 2 + .../project.json | 1 + .../Migrations/MigrationBuilderExtensions.cs | 56 ++++++++++ ...gsql.EntityFrameworkCore.PostgreSQL.csproj | 3 +- src/Shared/Check.cs | 2 +- 8 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Migrations/Design/NpgsqlCSharpMigrationOperationGenerator.cs create mode 100644 src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/MigrationBuilderExtensions.cs diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Migrations/Design/NpgsqlCSharpMigrationOperationGenerator.cs b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Migrations/Design/NpgsqlCSharpMigrationOperationGenerator.cs new file mode 100644 index 000000000..fa22613f0 --- /dev/null +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Migrations/Design/NpgsqlCSharpMigrationOperationGenerator.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore.Internal; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Utilities; + +namespace Microsoft.EntityFrameworkCore.Migrations.Design +{ + public class NpgsqlCSharpMigrationOperationGenerator : CSharpMigrationOperationGenerator + { + readonly CSharpHelper _code; + + public NpgsqlCSharpMigrationOperationGenerator( + [NotNull] CSharpHelper codeHelper, + [NotNull] IDatabaseProviderServices providerServices + ) : base(codeHelper) + { + _code = codeHelper; + } + + protected override void Generate([NotNull] MigrationOperation operation, [NotNull] IndentedStringBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + var asCreateExtensionOperation = operation as NpgsqlCreatePostgresExtensionOperation; + if (asCreateExtensionOperation != null) + { + Generate(asCreateExtensionOperation, builder); + return; + } + + var asDropExtensionOperation = operation as NpgsqlDropPostgresExtensionOperation; + if (asDropExtensionOperation != null) + { + Generate(asDropExtensionOperation, builder); + return; + } + + throw new InvalidOperationException(DesignCoreStrings.UnknownOperation(operation.GetType())); + } + + protected virtual void Generate([NotNull] NpgsqlCreatePostgresExtensionOperation operation, [NotNull] IndentedStringBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder.Append(".CreatePostgresExtension("); + + if (operation.Schema == null && operation.Version == null) + { + builder.Append(_code.Literal(operation.Name)); + } + else + { + using (builder.Indent()) + { + builder + .Append("name: ") + .Append(_code.Literal(operation.Name)); + + if (operation.Schema != null) + { + builder + .AppendLine(",") + .Append("schema: ") + .Append(_code.Literal(operation.Schema)); + } + + if (operation.Version != null) + { + builder + .AppendLine(",") + .Append("version: ") + .Append(_code.Literal(operation.Version)); + } + } + } + builder.Append(")"); + + Annotations(operation.GetAnnotations(), builder); + } + + protected virtual void Generate([NotNull] NpgsqlDropPostgresExtensionOperation operation, [NotNull] IndentedStringBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append(".DropPostgresExtension(") + .Append(_code.Literal(operation.Name)) + .Append(")"); + + Annotations(operation.GetAnnotations(), builder); + } + } +} diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.csproj b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.csproj index c0704acc5..56d75a05c 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.csproj +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.csproj @@ -52,6 +52,7 @@ + @@ -81,4 +82,4 @@ --> - + \ No newline at end of file diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.project.json b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.project.json index 858081768..0d20d46f0 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.project.json +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.project.json @@ -1,6 +1,7 @@ { "dependencies" : { "Microsoft.EntityFrameworkCore": "1.0.0", + "Microsoft.EntityFrameworkCore.Design.Core": "1.0.0-preview2-final", "Microsoft.EntityFrameworkCore.Relational": "1.0.0", "Microsoft.EntityFrameworkCore.Relational.Design": "1.0.0", "Microsoft.Extensions.DependencyInjection": "1.0.0", diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/NpgsqlDesignTimeServices.cs b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/NpgsqlDesignTimeServices.cs index cec782c1e..8a3dc795f 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/NpgsqlDesignTimeServices.cs +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/NpgsqlDesignTimeServices.cs @@ -23,6 +23,7 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations.Design; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.Extensions.DependencyInjection; @@ -36,6 +37,7 @@ public virtual IServiceCollection ConfigureDesignTimeServices([NotNull] IService .AddSingleton() .AddSingleton() .AddSingleton() + .AddSingleton() .AddSingleton(); } } diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json index f8f1cfe6a..1fa547a0a 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json @@ -19,6 +19,7 @@ }, "dependencies" : { "Microsoft.EntityFrameworkCore": "1.0.0", + "Microsoft.EntityFrameworkCore.Design.Core": "1.0.0-preview2-final", "Microsoft.EntityFrameworkCore.Relational": "1.0.0", "Microsoft.EntityFrameworkCore.Relational.Design": "1.0.0", "Microsoft.Extensions.DependencyInjection": "1.0.0", diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/MigrationBuilderExtensions.cs b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/MigrationBuilderExtensions.cs new file mode 100644 index 000000000..b96a40df4 --- /dev/null +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/MigrationBuilderExtensions.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders; +using Microsoft.EntityFrameworkCore.Utilities; + +namespace Microsoft.EntityFrameworkCore.Migrations +{ + public static class MigrationBuilderExtensions + { + static readonly string NpgsqlProviderName = typeof(MigrationBuilderExtensions).GetTypeInfo().Assembly.GetName().Name; + + public static OperationBuilder CreatePostgresExtension( + this MigrationBuilder builder, + [NotNull] string name, + string schema = null, + string version = null + ) + { + Check.NotEmpty(name, nameof(name)); + Check.NullButNotEmpty(schema, nameof(schema)); + Check.NullButNotEmpty(version, nameof(schema)); + + var operation = new NpgsqlCreatePostgresExtensionOperation + { + Name = name, + Schema = schema, + Version = version + }; + + if (builder.ActiveProvider == NpgsqlProviderName) + builder.Operations.Add(operation); + + return new OperationBuilder(operation); + } + + public static OperationBuilder DropPostgresExtension( + this MigrationBuilder builder, + [NotNull] string name + ) + { + Check.NotEmpty(name, nameof(name)); + + var operation = new NpgsqlDropPostgresExtensionOperation { Name = name }; + + if (builder.ActiveProvider == NpgsqlProviderName) + builder.Operations.Add(operation); + + return new OperationBuilder(operation); + } + } +} diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.csproj b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.csproj index 96b05f819..ee16ffce6 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.csproj +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.csproj @@ -68,6 +68,7 @@ + @@ -135,4 +136,4 @@ --> - + \ No newline at end of file diff --git a/src/Shared/Check.cs b/src/Shared/Check.cs index 69ba80b47..b50e1b0dc 100644 --- a/src/Shared/Check.cs +++ b/src/Shared/Check.cs @@ -102,7 +102,7 @@ public static string NotEmpty(string value, [InvokerParameterName] [NotNull] str return value; } - public static string NullButNotEmpty(string value, [InvokerParameterName] [NotNull] string parameterName) + public static string NullButNotEmpty([CanBeNull] string value, [InvokerParameterName] [NotNull] string parameterName) { if (!ReferenceEquals(value, null) && (value.Length == 0)) From 220b6b63aa8e1f844bd87571cfcfdc0dca8f4655 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Thu, 7 Jul 2016 20:04:23 +0000 Subject: [PATCH 02/12] Bump version to 1.0.1-ci --- .../project.json | 2 +- src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json | 2 +- src/Shared/CommonAssemblyInfo.cs | 6 +++--- teamcity_set_version.cmd | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json index 1fa547a0a..44cd729fa 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0", + "version": "1.0.1-ci-*", "packOptions": { "authors": [ "Shay Rojansky" ], "description": "Design-time Entity Framework Core Functionality for PostgreSQL", diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json b/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json index 448ceb3ca..4ea687e25 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0", + "version": "1.0.1-ci-*", "packOptions": { "authors": [ "Shay Rojansky" ], "description" : "PostgreSQL provider for Entity Framework Core", diff --git a/src/Shared/CommonAssemblyInfo.cs b/src/Shared/CommonAssemblyInfo.cs index 50ef3109c..0dbf6c8ba 100644 --- a/src/Shared/CommonAssemblyInfo.cs +++ b/src/Shared/CommonAssemblyInfo.cs @@ -8,6 +8,6 @@ [assembly: AssemblyCopyright("Copyright © 2002 - 2016 Npgsql Development Team")] // The following version attributes get rewritten by GitVersion as part of the build -[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("1.0.0")] -[assembly: AssemblyInformationalVersion("1.0.0")] +[assembly: AssemblyVersion("1.0.1")] +[assembly: AssemblyFileVersion("1.0.1")] +[assembly: AssemblyInformationalVersion("1.0.1-ci")] diff --git a/teamcity_set_version.cmd b/teamcity_set_version.cmd index 04a0f4387..c586ad631 100644 --- a/teamcity_set_version.cmd +++ b/teamcity_set_version.cmd @@ -1 +1 @@ -echo ##teamcity[buildNumber '1.0.0-%1'] +echo ##teamcity[buildNumber '1.0.1-ci-%1'] From 66769209fd6385420bcc19942b763570a9e0ae3e Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 8 Jul 2016 13:24:01 +0000 Subject: [PATCH 03/12] Reenable skipped test In reaction to https://github.com/aspnet/EntityFramework/issues/5717 (cherry picked from commit de376563274c38224f1267fe3dbd66b2b0ecac5a) --- .../QueryNpgsqlTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs index 142a9f88a..eaa774fca 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs @@ -2695,7 +2695,6 @@ public override void Where_concat_string_int_comparison2() Sql); } - [Fact(Skip="https://github.com/aspnet/EntityFramework/issues/5717")] public override void Where_concat_string_int_comparison3() { base.Where_concat_string_int_comparison3(); From ae910979d5f34c715713c0c08c624521dd0d1a57 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 8 Jul 2016 13:30:58 +0000 Subject: [PATCH 04/12] Backport some test tweaks --- .../DataAnnotationNpgsqlFixture.cs | 26 +++++++++++++++++++ .../NorthwindQueryNpgsqlFixture.cs | 21 +++++++-------- .../TestModels/NpgsqlNorthwindContext.cs | 6 +++-- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs index edd208a43..573055f2f 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs @@ -6,7 +6,11 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Internal; +using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Specification.Tests; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage.Internal; using Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests.Utilities; namespace Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests @@ -28,6 +32,28 @@ public DataAnnotationNpgsqlFixture() .BuildServiceProvider(); } + public override ModelValidator ThrowingValidator + => new ThrowingModelValidator( + _serviceProvider.GetService>(), + new NpgsqlAnnotationProvider(), + new NpgsqlTypeMapper()); + + private class ThrowingModelValidator : RelationalModelValidator + { + public ThrowingModelValidator( + ILogger loggerFactory, + IRelationalAnnotationProvider relationalExtensions, + IRelationalTypeMapper typeMapper) + : base(loggerFactory, relationalExtensions, typeMapper) + { + } + + protected override void ShowWarning(string message) + { + throw new InvalidOperationException(message); + } + } + public override NpgsqlTestStore CreateTestStore() { return NpgsqlTestStore.GetOrCreateShared(DatabaseName, () => diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs index e581eb12a..e134983ae 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs @@ -16,7 +16,6 @@ namespace Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests { public class NorthwindQueryNpgsqlFixture : NorthwindQueryRelationalFixture, IDisposable { - private readonly IServiceProvider _serviceProvider; private readonly DbContextOptions _options; private readonly NpgsqlTestStore _testStore = NpgsqlNorthwindContext.GetSharedStore(); @@ -24,21 +23,18 @@ public class NorthwindQueryNpgsqlFixture : NorthwindQueryRelationalFixture, IDis public NorthwindQueryNpgsqlFixture() { - _serviceProvider - = new ServiceCollection() - .AddEntityFrameworkNpgsql() - .AddSingleton(TestNpgsqlModelSource.GetFactory(OnModelCreating)) - .AddSingleton(_testSqlLoggerFactory) - .BuildServiceProvider(); - _options = BuildOptions(); } - protected DbContextOptions BuildOptions() + public override DbContextOptions BuildOptions(IServiceCollection additionalServices = null) => ConfigureOptions( new DbContextOptionsBuilder() .EnableSensitiveDataLogging() - .UseInternalServiceProvider(_serviceProvider)) + .UseInternalServiceProvider((additionalServices ?? new ServiceCollection()) + .AddEntityFrameworkNpgsql() + .AddSingleton(TestNpgsqlModelSource.GetFactory(OnModelCreating)) + .AddSingleton(_testSqlLoggerFactory) + .BuildServiceProvider())) .UseNpgsql( _testStore.ConnectionString, b => @@ -54,8 +50,9 @@ protected virtual void ConfigureOptions(NpgsqlDbContextOptionsBuilder sqlServerD { } - public override NorthwindContext CreateContext() - => new NpgsqlNorthwindContext(_options); + public override NorthwindContext CreateContext( + QueryTrackingBehavior queryTrackingBehavior = QueryTrackingBehavior.TrackAll) + => new NpgsqlNorthwindContext(_options, queryTrackingBehavior); public void Dispose() => _testStore.Dispose(); diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs index 15d5abc6c..2ec9efbb3 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs @@ -15,10 +15,12 @@ public class NpgsqlNorthwindContext : NorthwindContext public static readonly string DatabaseName = StoreName; public static readonly string ConnectionString = NpgsqlTestStore.CreateConnectionString(DatabaseName); - public NpgsqlNorthwindContext(DbContextOptions options) - : base(options) + public NpgsqlNorthwindContext(DbContextOptions options, + QueryTrackingBehavior queryTrackingBehavior = QueryTrackingBehavior.TrackAll) + : base(options, queryTrackingBehavior) { } + public static NpgsqlTestStore GetSharedStore() { return NpgsqlTestStore.GetOrCreateShared( From 3497f580e87e168358e369176b22b3548d81dc8e Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 8 Jul 2016 13:43:50 +0000 Subject: [PATCH 05/12] Add IF NOT EXISTS when creating extensions This is necessary if you have multiple contexts, each relying on the extension - multiple add operations are created. Fixes #66 (cherry picked from commit 6e734cdbada9ffabc3d6d43152defbb1259ffe2b) --- .../Migrations/NpgsqlMigrationsSqlGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs index 633ce6bc3..4c2e4b409 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs @@ -432,7 +432,7 @@ public virtual void Generate(NpgsqlCreatePostgresExtensionOperation operation, [ Check.NotNull(builder, nameof(builder)); builder - .Append("CREATE EXTENSION ") + .Append("CREATE EXTENSION IF NOT EXISTS") .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name)); if (operation.Schema != null) From 58d40fd21960c666461a2ae6b35978480f3c0a27 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sat, 9 Jul 2016 09:15:13 +0000 Subject: [PATCH 06/12] Add missing xprojs --- ...ntityFrameworkCore.PostgreSQL.Design.xproj | 19 +++++++++++++++++++ ...pgsql.EntityFrameworkCore.PostgreSQL.xproj | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.xproj create mode 100644 src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.xproj diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.xproj b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.xproj new file mode 100644 index 000000000..135e589db --- /dev/null +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/Npgsql.EntityFrameworkCore.PostgreSQL.Design.xproj @@ -0,0 +1,19 @@ + + + + 14.0.25420 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 180fc3ca-e92e-4b89-8a3a-81302f088f2e + Npgsql.EntityFrameworkCore.PostgreSQL.Design + .\obj + .\bin\ + + + + 2.0 + + + \ No newline at end of file diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.xproj b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.xproj new file mode 100644 index 000000000..39d9ba718 --- /dev/null +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Npgsql.EntityFrameworkCore.PostgreSQL.xproj @@ -0,0 +1,19 @@ + + + + 14.0.25420 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + a6370fdf-2140-4780-9671-ffce9688a1ab + Npgsql.EntityFrameworkCore.PostgreSQL + .\obj + .\bin\ + + + + 2.0 + + + \ No newline at end of file From 15f73ea625e7fd69d93b71bef50e77f042f55c5a Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sun, 10 Jul 2016 16:04:25 +0000 Subject: [PATCH 07/12] Enable commented-out testing See #25, #26. (cherry picked from commit af4ec30314ab4ab1d6fa14985c24bddfe07368a1) --- .../BuiltInDataTypesNpgsqlTest.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/BuiltInDataTypesNpgsqlTest.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/BuiltInDataTypesNpgsqlTest.cs index bd47eba78..823d9cd9a 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/BuiltInDataTypesNpgsqlTest.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/BuiltInDataTypesNpgsqlTest.cs @@ -119,14 +119,11 @@ public virtual void Can_query_using_any_mapped_data_type() // NpgsqlPoint? param19 = new NpgsqlPoint(5.2, 3.3); // Assert.Same(entity, context.Set().Single(e => e.Int == 999 && e.Point == param19)); - // The following fails because of https://github.com/aspnet/EntityFramework/issues/3617, - // or rather https://github.com/aspnet/EntityFramework/issues/4608 - //var param20 = @"{""a"": ""b""}"; - //Assert.Same(entity, context.Set().Single(e => e.Int == 999 && e.Jsonb == param20)); - - // The following fails because of https://github.com/aspnet/EntityFramework/issues/5365 - // var param21 = new Dictionary { { "a", "b" } }; - // Assert.Same(entity, context.Set().Single(e => e.Int == 999 && e.Hstore == param21)); + var param20 = @"{""a"": ""b""}"; + Assert.Same(entity, context.Set().Single(e => e.Int == 999 && e.Jsonb == param20)); + + var param21 = new Dictionary { { "a", "b" } }; + Assert.Same(entity, context.Set().Single(e => e.Int == 999 && e.Hstore == param21)); //SomeComposite param22 = new SomeComposite { SomeNumber = 8, SomeText = "foo" }; //Assert.Same(entity, context.Set().Single(e => e.Int == 999 && e.SomeComposite.Equals(param20))); From 09fd97fd29d1f6922484c35f5728f8fe0d2a84a1 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Thu, 14 Jul 2016 18:52:00 +0000 Subject: [PATCH 08/12] Fix String.Substring() translation bug Fixes #71 (cherry picked from commit 5e0e5d6a54fcece5991932f6a3ad70a7374700f6) --- .../NpgsqlStringSubstringTranslator.cs | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Query/ExpressionTranslators/Internal/NpgsqlStringSubstringTranslator.cs b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Query/ExpressionTranslators/Internal/NpgsqlStringSubstringTranslator.cs index 83425afdd..407b17ace 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Query/ExpressionTranslators/Internal/NpgsqlStringSubstringTranslator.cs +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Query/ExpressionTranslators/Internal/NpgsqlStringSubstringTranslator.cs @@ -31,19 +31,32 @@ namespace Microsoft.EntityFrameworkCore.Query.ExpressionTranslators.Internal { public class NpgsqlStringSubstringTranslator : IMethodCallTranslator { - private static readonly MethodInfo _methodInfo = typeof(string).GetTypeInfo().GetDeclaredMethods(nameof(string.Substring)) - .Where(m => m.GetParameters().Count() == 2) - .Single(); + private static readonly MethodInfo _methodInfo = typeof(string).GetTypeInfo() + .GetDeclaredMethods(nameof(string.Substring)) + .Single(m => m.GetParameters().Length == 2); - public virtual Expression Translate([NotNull] MethodCallExpression methodCallExpression) - { - if (methodCallExpression.Method == _methodInfo) - { - var sqlArguments = new[] { methodCallExpression.Object }.Concat(methodCallExpression.Arguments); - return new SqlFunctionExpression("SUBSTRING", methodCallExpression.Type, sqlArguments); - } - - return null; - } + /// + /// This API supports the Entity Framework Core infrastructure and is not intended to be used + /// directly from your code. This API may change or be removed in future releases. + /// + [CanBeNull] + public virtual Expression Translate(MethodCallExpression methodCallExpression) + => methodCallExpression.Method == _methodInfo + ? new SqlFunctionExpression( + "SUBSTRING", + methodCallExpression.Type, + new[] + { + methodCallExpression.Object, + // Accommodate for SQL Server assumption of 1-based string indexes + methodCallExpression.Arguments[0].NodeType == ExpressionType.Constant + ? (Expression)Expression.Constant( + (int)((ConstantExpression)methodCallExpression.Arguments[0]).Value + 1) + : Expression.Add( + methodCallExpression.Arguments[0], + Expression.Constant(1)), + methodCallExpression.Arguments[1] + }) + : null; } } From 6c7b40f696f6a84323bb682f162ff470f4cac6b4 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 15 Jul 2016 19:48:54 +0000 Subject: [PATCH 09/12] Add missing space in extension migration (cherry picked from commit 85eddd810113f814f4860840c6dd963d05226c49) --- .../Migrations/NpgsqlMigrationsSqlGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs index 4c2e4b409..cc9408950 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/Migrations/NpgsqlMigrationsSqlGenerator.cs @@ -432,7 +432,7 @@ public virtual void Generate(NpgsqlCreatePostgresExtensionOperation operation, [ Check.NotNull(builder, nameof(builder)); builder - .Append("CREATE EXTENSION IF NOT EXISTS") + .Append("CREATE EXTENSION IF NOT EXISTS ") .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name)); if (operation.Schema != null) From 176a8534cd6e73cbe1ffe80c2651abaf41d82b6a Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Thu, 21 Jul 2016 20:48:24 +0000 Subject: [PATCH 10/12] Revert "Backport some test tweaks" This reverts commit ae910979d5f34c715713c0c08c624521dd0d1a57. --- .../DataAnnotationNpgsqlFixture.cs | 26 ------------------- .../NorthwindQueryNpgsqlFixture.cs | 21 ++++++++------- .../TestModels/NpgsqlNorthwindContext.cs | 6 ++--- 3 files changed, 14 insertions(+), 39 deletions(-) diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs index 573055f2f..edd208a43 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/DataAnnotationNpgsqlFixture.cs @@ -6,11 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Internal; -using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Specification.Tests; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; using Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests.Utilities; namespace Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests @@ -32,28 +28,6 @@ public DataAnnotationNpgsqlFixture() .BuildServiceProvider(); } - public override ModelValidator ThrowingValidator - => new ThrowingModelValidator( - _serviceProvider.GetService>(), - new NpgsqlAnnotationProvider(), - new NpgsqlTypeMapper()); - - private class ThrowingModelValidator : RelationalModelValidator - { - public ThrowingModelValidator( - ILogger loggerFactory, - IRelationalAnnotationProvider relationalExtensions, - IRelationalTypeMapper typeMapper) - : base(loggerFactory, relationalExtensions, typeMapper) - { - } - - protected override void ShowWarning(string message) - { - throw new InvalidOperationException(message); - } - } - public override NpgsqlTestStore CreateTestStore() { return NpgsqlTestStore.GetOrCreateShared(DatabaseName, () => diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs index e134983ae..e581eb12a 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/NorthwindQueryNpgsqlFixture.cs @@ -16,6 +16,7 @@ namespace Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests { public class NorthwindQueryNpgsqlFixture : NorthwindQueryRelationalFixture, IDisposable { + private readonly IServiceProvider _serviceProvider; private readonly DbContextOptions _options; private readonly NpgsqlTestStore _testStore = NpgsqlNorthwindContext.GetSharedStore(); @@ -23,18 +24,21 @@ public class NorthwindQueryNpgsqlFixture : NorthwindQueryRelationalFixture, IDis public NorthwindQueryNpgsqlFixture() { + _serviceProvider + = new ServiceCollection() + .AddEntityFrameworkNpgsql() + .AddSingleton(TestNpgsqlModelSource.GetFactory(OnModelCreating)) + .AddSingleton(_testSqlLoggerFactory) + .BuildServiceProvider(); + _options = BuildOptions(); } - public override DbContextOptions BuildOptions(IServiceCollection additionalServices = null) + protected DbContextOptions BuildOptions() => ConfigureOptions( new DbContextOptionsBuilder() .EnableSensitiveDataLogging() - .UseInternalServiceProvider((additionalServices ?? new ServiceCollection()) - .AddEntityFrameworkNpgsql() - .AddSingleton(TestNpgsqlModelSource.GetFactory(OnModelCreating)) - .AddSingleton(_testSqlLoggerFactory) - .BuildServiceProvider())) + .UseInternalServiceProvider(_serviceProvider)) .UseNpgsql( _testStore.ConnectionString, b => @@ -50,9 +54,8 @@ protected virtual void ConfigureOptions(NpgsqlDbContextOptionsBuilder sqlServerD { } - public override NorthwindContext CreateContext( - QueryTrackingBehavior queryTrackingBehavior = QueryTrackingBehavior.TrackAll) - => new NpgsqlNorthwindContext(_options, queryTrackingBehavior); + public override NorthwindContext CreateContext() + => new NpgsqlNorthwindContext(_options); public void Dispose() => _testStore.Dispose(); diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs index 2ec9efbb3..15d5abc6c 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/TestModels/NpgsqlNorthwindContext.cs @@ -15,12 +15,10 @@ public class NpgsqlNorthwindContext : NorthwindContext public static readonly string DatabaseName = StoreName; public static readonly string ConnectionString = NpgsqlTestStore.CreateConnectionString(DatabaseName); - public NpgsqlNorthwindContext(DbContextOptions options, - QueryTrackingBehavior queryTrackingBehavior = QueryTrackingBehavior.TrackAll) - : base(options, queryTrackingBehavior) + public NpgsqlNorthwindContext(DbContextOptions options) + : base(options) { } - public static NpgsqlTestStore GetSharedStore() { return NpgsqlTestStore.GetOrCreateShared( From c10afa192ea12cfc3d8aa54664dd0696501685a0 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Thu, 21 Jul 2016 20:54:24 +0000 Subject: [PATCH 11/12] Revert "Reenable skipped test" This reverts commit 66769209fd6385420bcc19942b763570a9e0ae3e. --- .../QueryNpgsqlTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs index eaa774fca..142a9f88a 100644 --- a/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs +++ b/test/Npgsql.EntityFrameworkCore.PostgreSQL.FunctionalTests/QueryNpgsqlTest.cs @@ -2695,6 +2695,7 @@ public override void Where_concat_string_int_comparison2() Sql); } + [Fact(Skip="https://github.com/aspnet/EntityFramework/issues/5717")] public override void Where_concat_string_int_comparison3() { base.Where_concat_string_int_comparison3(); From a6409ee963a8b4b93c5ad3781bca8f4fa771af4e Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Thu, 21 Jul 2016 20:57:49 +0000 Subject: [PATCH 12/12] Bump version to 1.0.1 --- src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json | 2 +- src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json | 2 +- src/Shared/CommonAssemblyInfo.cs | 2 +- teamcity_set_version.cmd | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json index 44cd729fa..bb5a7c395 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL.Design/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.1-ci-*", + "version": "1.0.1", "packOptions": { "authors": [ "Shay Rojansky" ], "description": "Design-time Entity Framework Core Functionality for PostgreSQL", diff --git a/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json b/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json index 4ea687e25..c322e62a3 100644 --- a/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json +++ b/src/Npgsql.EntityFrameworkCore.PostgreSQL/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.1-ci-*", + "version": "1.0.1", "packOptions": { "authors": [ "Shay Rojansky" ], "description" : "PostgreSQL provider for Entity Framework Core", diff --git a/src/Shared/CommonAssemblyInfo.cs b/src/Shared/CommonAssemblyInfo.cs index 0dbf6c8ba..3bbf4ba7f 100644 --- a/src/Shared/CommonAssemblyInfo.cs +++ b/src/Shared/CommonAssemblyInfo.cs @@ -10,4 +10,4 @@ // The following version attributes get rewritten by GitVersion as part of the build [assembly: AssemblyVersion("1.0.1")] [assembly: AssemblyFileVersion("1.0.1")] -[assembly: AssemblyInformationalVersion("1.0.1-ci")] +[assembly: AssemblyInformationalVersion("1.0.1")] diff --git a/teamcity_set_version.cmd b/teamcity_set_version.cmd index c586ad631..102e410d3 100644 --- a/teamcity_set_version.cmd +++ b/teamcity_set_version.cmd @@ -1 +1 @@ -echo ##teamcity[buildNumber '1.0.1-ci-%1'] +echo ##teamcity[buildNumber '1.0.1-%1']