/// <summary>
    /// 配置分片特性。
    /// </summary>
    /// <param name="strategyType">给定的策略类型。</param>
    /// <param name="suffix">给定的后缀(支持的参数可参考指定的分片策略类型)。</param>
    /// <param name="configureAction">给定的分片命名特性配置动作(可选)。</param>
    /// <returns>返回 <see cref="AccessorDbContextOptionsBuilder"/>。</returns>
    public virtual AccessorDbContextOptionsBuilder WithSharding(Type strategyType,
                                                                string suffix, Action <ShardedAttribute>?configureAction = null)
    {
        var attribute = new ShardedAttribute(suffix, strategyType);

        attribute.TryUpdateBaseNameFromConnectionString(_relationalOptionsExtension?.ConnectionString);

        configureAction?.Invoke(attribute);

        return(WithSharding(attribute));
    }
    /// <summary>
    /// 对实体映射的数据表分片。
    /// </summary>
    /// <param name="manager">给定的 <see cref="IShardingManager"/>。</param>
    /// <param name="entityType">给定的实体类型。</param>
    /// <param name="entity">给定的实体对象。</param>
    /// <param name="tableName">给定的表名。</param>
    /// <returns>返回 <see cref="ShardedDescriptor"/>。</returns>
    public static ShardedDescriptor ShardEntity(this IShardingManager manager,
                                                Type entityType, object?entity, string?tableName)
    {
        var attribute  = ShardedAttribute.ParseFromEntity(entityType, tableName);
        var descriptor = manager.CreateDescriptor(attribute);

        descriptor.ReferenceType  = entityType;
        descriptor.ReferenceValue = entity;
        descriptor.ReferenceName  = tableName;

        descriptor.DefaultStrategy?.FormatSuffix(descriptor);
        descriptor.Entity?.Properties.ForEach(p => p.Strategy.FormatSuffix(descriptor));

        return(descriptor);
    }
    private static ShardedDescriptor CreateDescriptor(this IShardingManager manager,
                                                      ShardedAttribute attribute)
    {
        if (string.IsNullOrEmpty(attribute.BaseName))
        {
            throw new ArgumentException($"The {nameof(attribute)}.{nameof(attribute.BaseName)} is null or empty.");
        }

        var descriptor = new ShardedDescriptor(attribute.BaseName, attribute.Suffix);

        if (attribute.DefaultStrategyType is not null)
        {
            descriptor.DefaultStrategy = manager.GetStrategy(attribute.DefaultStrategyType);
        }

        return(descriptor);
    }
 /// <summary>
 /// 配置分片特性。
 /// </summary>
 /// <param name="sharded">给定的 <see cref="ShardedAttribute"/>。</param>
 /// <returns>返回 <see cref="AccessorDbContextOptionsBuilder"/>。</returns>
 public virtual AccessorDbContextOptionsBuilder WithSharding(ShardedAttribute sharded)
 => WithOption(e => e.WithSharding(sharded));