我正在使用带有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
的分片组件?
答案 0 :(得分:0)
在删除分片数据库之前,应使用ShardMap.DeleteShard
将其从分片地图管理器中删除。这是一种安全的删除方法,因为在允许删除分片之前,分片映射管理器将检查分片是否没有映射(如果没有映射到分片,那么希望分片应该是空的分片数据 - 尽管最后一部分是您的责任,但是分片地图管理器无法为您验证。)
此时您已经删除了数据库,您可以使用RecoveryManager.DetachShard
从分片地图管理器中删除分片数据库。这通常很危险,因为该分片的所有映射都将被删除,这就是首选DeleteShard
的原因。
那么如果您创建一个具有相同名称的新数据库,则需要调用ShardMap.CreateShard
在该分片数据库上创建分片模式,并将该分片数据库添加到分片地图管理器。但是您没有调用它,因此未创建分片架构。 (请注意,如果您之前未致电CreateShard
或DeleteShard
,则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
。