我正在尝试使用自定义 AccountPart 扩展 UserType。我不希望用户帐户 ID 成为内容部分 ID,我希望 AccountId 字段是独立的自动递增 5 位数字(如 10300、10301)或至少是自动生成的 Guid。
我已经尝试了很多次来实现它,但仍然没有。这是我的尝试。结果是第一个用户的 00000000-0000-0000-0000-000000000000 ,第二个用户出现异常。Guid 没有生成 =(.
帐户部分:
public Guid AccountId
{
get { return Record.AccountId; }
set { Record.AccountId = Guid.NewGuid(); }
}
public decimal RealMoney
{
get { return Record.RealMoney; }
set { Record.RealMoney = value; }
}
public decimal VirtualMoney
{
get { return Record.VirtualMoney; }
set { Record.VirtualMoney = value; }
}
public decimal BonusPoints
{
get { return Record.BonusPoints; }
set { Record.BonusPoints = value; }
}
迁移者:
SchemaBuilder.CreateTable("AccountPartRecord",
table => table
.ContentPartRecord()
.Column<Guid>("AccountId",
x => x
.WithType(DbType.Guid)
.Unique()
.NotNull()))
ContentDefinitionManager.AlterPartDefinition("AccountPart",
builder => builder.Attachable());
ContentDefinitionManager.AlterTypeDefinition("User",
cfg => cfg.WithPart("AccountPart"));
我也尝试以这种方式添加 AccountId:
SchemaBuilder.ExecuteSql(@"
ALTER TABLE [BetIt].[dbo].[Betit_AccountPartRecord]
ADD AccountId UNIQUEIDENTIFIER DEFAULT NEWID()");
它的行为相同 - 为每个新用户设置 emty Guid。但是,如果我打开 Sql Management Studio 并手动添加新记录,它将生成一个随机的 Guid。我完全糊涂了……
更新: 我实际上已经通过使用处理程序实现了内容部分的自动 Guid 生成。但这对我来说更像是解决方法。我不相信这是产生独特价值的唯一途径。
迁移者:
SchemaBuilder.CreateTable("AccountPartRecord",
table => table
.ContentPartRecord()
.Column<long>("AccountId",
x => x
.WithType(DbType.Guid)
.NotNull()
.Unique())
部分:
public class AccountPart : ContentPart<AccountPartRecord>
{
public Guid AccountId
{
get { return Record.AccountId; }
set { Record.AccountId = value; }
}
}
处理程序:
public class AccountPartHandler : ContentHandler
{
public AccountPartHandler(IRepository<AccountPartRecord> repository)
{
Filters.Add(new ActivatingFilter<AccountPart>("User"));
Filters.Add(StorageFilter.For(repository));
OnCreating<AccountPart>((context, accountPart) =>
accountPart.AccountId = Guid.NewGuid());
}
}