提交 5c31a80e 编写于 作者: S Shay Rojansky

Allow database template on context

Closes #2
上级 659da0a5
......@@ -30,5 +30,6 @@ namespace Microsoft.EntityFrameworkCore.Metadata
public interface INpgsqlModelAnnotations : IRelationalModelAnnotations
{
IReadOnlyList<IPostgresExtension> PostgresExtensions { get; }
string DatabaseTemplate { get; }
}
}
......@@ -33,5 +33,6 @@ public static class NpgsqlAnnotationNames
public const string SequenceSchema = "SequenceSchema";
public const string IndexMethod = "IndexMethod";
public const string PostgresExtensionPrefix = "PostgresExtension:";
public const string DatabaseTemplate = "DatabaseTemplate";
}
}
......@@ -35,6 +35,7 @@ protected NpgsqlFullAnnotationNames(string prefix)
SequenceSchema = prefix + NpgsqlAnnotationNames.SequenceSchema;
IndexMethod = prefix + NpgsqlAnnotationNames.IndexMethod;
PostgresExtensionPrefix = prefix + NpgsqlAnnotationNames.PostgresExtensionPrefix;
DatabaseTemplate = prefix + NpgsqlAnnotationNames.DatabaseTemplate;
}
public new static NpgsqlFullAnnotationNames Instance { get; } = new NpgsqlFullAnnotationNames(NpgsqlAnnotationNames.Prefix);
......@@ -46,5 +47,6 @@ protected NpgsqlFullAnnotationNames(string prefix)
public readonly string SequenceSchema;
public readonly string IndexMethod;
public readonly string PostgresExtensionPrefix;
public readonly string DatabaseTemplate;
}
}
......@@ -6,6 +6,7 @@
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.EntityFrameworkCore.Utilities;
namespace Microsoft.EntityFrameworkCore.Metadata
{
......@@ -29,5 +30,18 @@ public virtual PostgresExtension GetOrAddPostgresExtension([CanBeNull] string na
public virtual IReadOnlyList<IPostgresExtension> PostgresExtensions
=> PostgresExtension.GetPostgresExtensions(Model, NpgsqlFullAnnotationNames.Instance.PostgresExtensionPrefix).ToList();
public virtual string DatabaseTemplate
{
get { return (string)Annotations.GetAnnotation(NpgsqlFullAnnotationNames.Instance.DatabaseTemplate, null); }
[param: CanBeNull]
set { SetDatabaseTemplate(value); }
}
protected virtual bool SetDatabaseTemplate([CanBeNull] string value)
=> Annotations.SetAnnotation(
NpgsqlFullAnnotationNames.Instance.DatabaseTemplate,
null,
Check.NullButNotEmpty(value, nameof(value)));
}
}
......@@ -288,8 +288,7 @@ protected override void Generate(EnsureSchemaOperation operation, IModel model,
builder
.Append("CREATE SCHEMA IF NOT EXISTS ")
.Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
.AppendLine(SqlGenerationHelper.StatementTerminator);
.Append(SqlGenerationHelper.DelimitIdentifier(operation.Name));
}
public virtual void Generate(NpgsqlCreateDatabaseOperation operation, IModel model, RelationalCommandListBuilder builder)
......@@ -299,8 +298,14 @@ public virtual void Generate(NpgsqlCreateDatabaseOperation operation, IModel mod
builder
.Append("CREATE DATABASE ")
.Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
.AppendLine(SqlGenerationHelper.StatementTerminator);
.Append(SqlGenerationHelper.DelimitIdentifier(operation.Name));
if (operation.Template != null)
{
builder
.Append(" TEMPLATE ")
.Append(SqlGenerationHelper.DelimitIdentifier(operation.Template));
}
}
public virtual void Generate(NpgsqlDropDatabaseOperation operation, IModel model, RelationalCommandListBuilder builder)
......@@ -321,7 +326,7 @@ public virtual void Generate(NpgsqlDropDatabaseOperation operation, IModel model
"SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '")
.Append(operation.Name)
.Append("'")
.AppendLine(SqlGenerationHelper.StatementTerminator)
.EndCommand()
.Append("DROP DATABASE ")
.Append(dbName);
}
......@@ -348,8 +353,6 @@ public virtual void Generate(NpgsqlCreatePostgresExtensionOperation operation, I
.Append(" VERSION ")
.Append(SqlGenerationHelper.DelimitIdentifier(operation.Version));
}
builder.AppendLine(SqlGenerationHelper.StatementTerminator);
}
protected override void Generate(DropIndexOperation operation, IModel model, RelationalCommandListBuilder builder)
......
......@@ -28,5 +28,7 @@ namespace Microsoft.EntityFrameworkCore.Migrations.Operations
public class NpgsqlCreateDatabaseOperation : MigrationOperation
{
public virtual string Name { get;[param: NotNull] set; }
[CanBeNull]
public virtual string Template { get; set; }
}
}
......@@ -24,5 +24,16 @@ public static class NpgsqlModelBuilderExtensions
return new NpgsqlPostgresExtensionBuilder(
modelBuilder.Model.Npgsql().GetOrAddPostgresExtension(name, schema));
}
public static ModelBuilder HasDatabaseTemplate(
[NotNull] this ModelBuilder modelBuilder,
[NotNull] string templateDatabaseName)
{
Check.NotNull(modelBuilder, nameof(modelBuilder));
Check.NotEmpty(templateDatabaseName, nameof(templateDatabaseName));
modelBuilder.Model.Npgsql().DatabaseTemplate = templateDatabaseName;
return modelBuilder;
}
}
}
......@@ -117,7 +117,7 @@ FROM information_schema.tables
");
IEnumerable<IRelationalCommand> CreateCreateOperations()
=> _migrationsSqlGenerator.Generate(new[] { new NpgsqlCreateDatabaseOperation { Name = _connection.DbConnection.Database } });
=> _migrationsSqlGenerator.Generate(new[] { new NpgsqlCreateDatabaseOperation { Name = _connection.DbConnection.Database, Template = Model.Npgsql().DatabaseTemplate } });
/// <summary>
/// Creates migration operations that should take place immediately after creating the database,
......
......@@ -162,6 +162,30 @@ public override void CreateIndexOperation_nonunique()
Sql);
}
[Fact]
public virtual void CreateDatabaseOperation()
{
Generate(new NpgsqlCreateDatabaseOperation { Name = "Northwind" });
Assert.Equal(
@"CREATE DATABASE ""Northwind"";" + EOL,
Sql);
}
[Fact]
public virtual void CreateDatabaseOperation_with_template()
{
Generate(new NpgsqlCreateDatabaseOperation
{
Name = "Northwind",
Template = "MyTemplate"
});
Assert.Equal(
@"CREATE DATABASE ""Northwind"" TEMPLATE ""MyTemplate"";" + EOL,
Sql);
}
public override void CreateSequenceOperation_with_minValue_and_maxValue()
{
base.CreateSequenceOperation_with_minValue_and_maxValue();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册