dotnetcore / dotnetcore/sharding-core

關於Migration表名&导航属性

Open
#224 11 comments 0 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
1.3k
Forks
183
Avg merge
7h 43m
Merged PRs (30d)
1

Description

目前有三個Entities:

User(不分表)
```c#
[Index(nameof(NationalId), IsUnique = true)]
public class User : BaseTrackUpdateEntity, IHasIdEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }

[Required, MinLength(8), MaxLength(10)]
public string NationalId { get; set; }

...

public virtual UserInvoiceSetting InvoiceSetting { get; set; }
}
```

InvoiceSetting(不分表)
```c#
[Index(nameof(UpdatedAt))]
public class UserInvoiceSetting
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public long UserId { get; set; }

[Required]
public CarrierType? CarrierType { get; set; } = ECPay.Invoice.Enums.CarrierType.ECPayMember;

...

public virtual User User { get; set; }
}
```

Transaction(按年分表)
```c#
public class Transaction : BaseHasAutoIdEntity
{
[Required, MinLength(1), MaxLength(15), RegularExpression(@"^\d{1,15}$")]
public string MatchId { get; set; }

[Required]
public long UserId { get; set; }

...
}
```

Transaction virtual table route
```c#
public class TransactionVTR : AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute
{
public override bool AutoCreateTableByTime() => true;

public override void Configure(EntityMetadataTableBuilder builder) =>
builder
.ShardingProperty(x => x.CreatedAt)
.TableSeparator("_");

public override DateTime GetBeginTime() => new(2022, 11, 1);
}
```

Program.cs(WebApi)
```c#
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("MyDatabase");

// Add services to the container.
builder.Services.AddShardingDbContext()
.UseRouteConfig(options =>
{
options.AddShardingTableRoute();
})
.UseConfig((serviceProvider, options) =>
{
string dataSourceName = Unified.UnifiedId.NewId();

options.UseShardingQuery((connection, builder) =>
{
builder.UseNpgsql(connection);
});
options.UseShardingTransaction((connection, builder) =>
{
builder.UseNpgsql(connection);
});
options.AddDefaultDataSource(dataSourceName, connectionString);
})
.AddShardingCore();
```

Migration script:
```sql
CREATE TABLE "Transactions" (
"Id" bigint GENERATED BY DEFAULT AS IDENTITY,
"MatchId" character varying(15) NOT NULL,
"UserId" bigint NOT NULL,
....
CONSTRAINT "PK_MatchedTransactions" PRIMARY KEY ("Id")
);

CREATE TABLE "UserInvoiceSettings" (
"UserId" bigint NOT NULL,
"CarrierType" integer NOT NULL,
CONSTRAINT "PK_UserInvoiceSettings" PRIMARY KEY ("UserId"),
CONSTRAINT "FK_UserInvoiceSettings_Users_UserId" FOREIGN KEY ("UserId") REFERENCES "Users" ("Id") ON DELETE CASCADE
);
```

1. Migration script創建的表名為`Transactions`而不是`Transactions_2022`,這樣是正確的嗎?
2. 官方文檔說明不支持导航属性,所以我在User & Transaction 沒有設定對應關係,但從script中看出這樣`Transaction表`就不支持外鍵約束,請問是否有其他的方式可以做到FK constraint呢?或是其實可以在entity中定義navigation property,只是不要調用`Include`就可以呢?

謝謝

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.