1

我将 azure Elastic 数据库模式与 Entity Framework Code First 一起使用。

当我创建一个新的分片数据库时,当我尝试创建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生成 my 的分片组件?

4

2 回答 2

0

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

此时,由于您已经删除了数据库,因此您可以使用RecoveryManager.DetachShard. 这样做通常很危险,因为到该分片的所有映射都将被删除,这就是DeleteShard首选的原因。

因此,如果您创建一个具有相同名称的新数据库,您需要调用ShardMap.CreateShard以在该分片 db 上创建分片模式并将该分片 db 添加到分片映射管理器。但是您没有调用它,因此没有创建分片模式。(请注意,CreateShard如果您没有打电话DeleteShardDetachShard更早,这将失败。)

于 2016-11-15T00:01:52.283 回答
0

创建分片数据库后,您必须调用 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.

于 2016-11-15T00:31:12.910 回答