dotnetcore / dotnetcore/sharding-core
關於Migration表名&导航属性
- 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.