我使用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管理器中。但是,您没有调用它,因此没有创建分片模式。(注意,如果之前没有调用DeleteShard
或DetachShard
, 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