-
Notifications
You must be signed in to change notification settings - Fork 177
Open
Description
目前有三個Entities:
User(不分表)
[Index(nameof(NationalId), IsUnique = true)]
public class User : BaseTrackUpdateEntity, IHasIdEntity<long>
{
[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(不分表)
[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(按年分表)
public class Transaction : BaseHasAutoIdEntity<long>
{
[Required, MinLength(1), MaxLength(15), RegularExpression(@"^\d{1,15}$")]
public string MatchId { get; set; }
[Required]
public long UserId { get; set; }
...
}Transaction virtual table route
public class TransactionVTR : AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute<Transaction>
{
public override bool AutoCreateTableByTime() => true;
public override void Configure(EntityMetadataTableBuilder<MatchedTransaction> builder) =>
builder
.ShardingProperty(x => x.CreatedAt)
.TableSeparator("_");
public override DateTime GetBeginTime() => new(2022, 11, 1);
}Program.cs(WebApi)
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("MyDatabase");
// Add services to the container.
builder.Services.AddShardingDbContext<MyContext>()
.UseRouteConfig(options =>
{
options.AddShardingTableRoute<TransactionVTR>();
})
.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:
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
);- Migration script創建的表名為
Transactions而不是Transactions_2022,這樣是正確的嗎? - 官方文檔說明不支持导航属性,所以我在User & Transaction 沒有設定對應關係,但從script中看出這樣
Transaction表就不支持外鍵約束,請問是否有其他的方式可以做到FK constraint呢?或是其實可以在entity中定義navigation property,只是不要調用Include就可以呢?
謝謝
Metadata
Metadata
Assignees
Labels
No labels