3

カスタム AccountPart で UserType を拡張しようとしています。ユーザー アカウント ID をコンテンツ パーツ ID にしたくありません。AccountId フィールドを、独立した自動インクリメントの 5 桁の数字 (10300、10301 など) または少なくとも自動生成された Guid にする必要があります。

私はそれを達成するために何度も試みましたが、それでも達成できませんでした。これが私の試みです。結果は、最初のユーザーの場合は 00000000-0000-0000-0000-000000000000 で、2 番目のユーザーの場合は例外が発生しました。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 は常に最初に空のレコードを作成し、次に値を入力することに注意してください。この場合、NotNulland/orUnique制約のある列が問題を引き起こす可能性があります。それらを避けるようにしてください。

于 2013-07-21T18:15:58.837 に答える