Skip to content

關於Migration表名&导航属性 #224

@ed555009

Description

@ed555009

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

謝謝

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