找不到存储过程'__ShardManagement.spBulkOperationShardMappingsLocal'



我使用azure弹性数据库模式与实体框架代码第一。

当我创建一个新的碎片数据库时,当我尝试创建PointShard映射

时抛出以下异常
     // Register the mapping of the tenant to the shard in the shard map.
        // After this step, DDR on the shard map can be used
        PointMapping<Guid> mapping;
        if (!ShardMap.TryGetMappingForKey(key, out mapping))
        {
            ShardMap.CreatePointMapping(key, shard);
        }

找不到存储过程"__ShardManagement.spBulkOperationShardMappingsLocal"

EF模式正在创建,但是分片模式和存储进程没有生成。

我如何确保我的DbContext的分片组件生成?

在删除shard数据库之前,您应该使用ShardMap.DeleteShard将其从shard map管理器中删除。这是一种安全的删除方式,因为在允许删除shard之前,shard map管理器将检查是否没有到shard的映射(如果没有到shard的映射,那么希望shard应该是空的分片数据-尽管最后一部分是你的责任,shard map管理器不能为你验证)。

此时,由于您已经删除了数据库,您可以使用RecoveryManager.DetachShard从碎片映射管理器中删除碎片db。这样做通常是危险的,因为所有到该shard的映射都将被删除,这就是为什么首选DeleteShard

所以如果你创建了一个同名的新数据库,你需要调用ShardMap.CreateShard在该shard db上创建分片模式,并将该shard db添加到shard map管理器中。但是,您没有调用它,因此没有创建分片模式。(注意,如果之前没有调用DeleteShardDetachShard, CreateShard将失败。)

创建了分片数据库之后,你必须调用CreateShard来创建支持分片的表和存储过程。下面是来自我们的分片创建类的代码片段。一旦数据库创建完成,我们就执行它。

var shardMapManagerConnectionString = ConfigurationManager.ConnectionStrings["CommonConnectionString"].ConnectionString;
var shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(shardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy);
var shardMap = shardMapManager.GetListShardMap<Guid>("shardMapName");
var shardLocation = new ShardLocation(shardServerName, shardName);
var shard = shardMap.CreateShard(shardLocation);

调用CreateShard后可以调用CreatePointMapping

相关内容

  • 没有找到相关文章

最新更新