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);

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