无法找到存储过程' __ ShardManagement.spBulkOperationShardMappingsLocal'

时间:2016-11-14 00:43:01

标签: c# entity-framework azure azure-sql-database azure-elastic-scale

我正在使用带有Entity Framework Code First的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);
        }
  

无法找到存储过程   &#39; __ ShardManagement.spBulkOperationShardMappingsLocal&#39;

正在创建EF模式,但未生成分片模式和存储过程。

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

2 个答案:

答案 0 :(得分:0)

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

此时您已经删除了数据库,您可以使用RecoveryManager.DetachShard从分片地图管理器中删除分片数据库。这通常很危险,因为该分片的所有映射都将被删除,这就是首选DeleteShard的原因。

那么如果您创建一个具有相同名称的新数据库,则需要调用ShardMap.CreateShard在该分片数据库上创建分片模式,并将该分片数据库添加到分片地图管理器。但是您没有调用它,因此未创建分片架构。 (请注意,如果您之前未致电CreateShardDeleteShard,则DetachShard将失败。)

答案 1 :(得分: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