3

我正在尝试使用自定义 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());

    }
}
4

1 回答 1

2

通过处理程序设置值不是一种解决方法,它实际上是首选方式(例如,看看如何IdentityPart设置唯一标识符)。所有逻辑都应该保存在代码中,而不是数据库(它只是一个数据存储)中。这意味着Guid和/或自定义标识符生成也应该在那里。

请注意,Orchard 总是先创建一个空记录,然后用值填充它。在这种情况下,带有NotNull和/或Unique约束的列可能会导致问题。尽量避免它们。

于 2013-07-21T18:15:58.837 回答