Skip to content

Feature Request: Add Support for EFCore Schemas by Treating Them as Databases #22

Description

@Felixzed

Feature Request

EFCore Entity Schemas can be treated like Clickhouse Databases to make EFCore output valid migrations.
In this feature request I propose a change to how Schemas are handled. I will be submitting a pull request along with my feature request.

Current behavior

Defining an EFCore Entity Configuration such that:

e.ToTable("my_table", "my_schema", table =>
{
table.HasMergeTreeEngine()
.WithOrderBy("Timestamp")
.WithPartitionBy("toYear(Timestamp)");
});
e.Property(x => x.Timestamp)
.HasColumnType("Date")
.HasColumnName("Timestamp");
e.Property(x => x.MyString)
.HasColumnType("String")
.HasColumnName("MyString");
e.HasNoKey();

and using that entity configuration in an EFCore migration produces the following migration code:

migrationBuilder.EnsureSchema(
name: "my_schema");
migrationBuilder.CreateTable(
name: "my_table",
schema: "my_schema",
columns: table => new
{
Timestamp = table.Column<DateOnly>(type: "Date32", nullable: false)
},
constraints: table =>
{
})
.Annotation("ClickHouse:Engine", "MergeTree")
.Annotation("ClickHouse:OrderBy", new[] { "Timestamp" })
.Annotation("ClickHouse:PartitionBy", new[] { "toYear(Timestamp)" });

Which fails on the ensure schema operation, saying schemas are not supported. This makes it difficult define database structure in EFCore.

Expected behavior

// C# EFCore Migration
migrationBuilder.EnsureSchema(
name: "pre_aggregates");
migrationBuilder.CreateTable(
name: "my_table",
schema: "my_schema",
columns: table => new
{
Timestamp = table.Column<DateOnly>(type: "Date32", nullable: false)
MyString = table.Column<string>(type: "String", nullable: false),
},
constraints: table =>
{
})
.Annotation("ClickHouse:Engine", "MergeTree")
.Annotation("ClickHouse:OrderBy", new[] { "Timestamp" })
.Annotation("ClickHouse:PartitionBy", new[] { "toYear(Timestamp)" });

// Should translate to:

CREATE DATABASE my_schema;
CREATE TABLE `my_schema`.`my_table` ( `Timestamp` Date32,
`MyString` String ) ENGINE = MergeTree() ORDER BY (`Timestamp`) PARTITION BY toYear(Timestamp);

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions