1

私はEntity Frameworkコードファーストでの晴れの弾性データベースパターンを使用しています。ストアドプロシージャ '__ShardManagement.spBulkOperationShardMappingsLocal'を見つけることができません

私はマップ

 // 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のシャーディングコンポーネントが確実に生成されるようにするにはどうすればよいですか?

答えて

0

シャードデータベースを削除する前に、シャードマップマネージャからShardMap.DeleteShardを使用してシャードデータベースを削除する必要があります。シャードを削除する前に、シャードマップマネージャはシャードへのマッピングがないことをチェックします(シャードへのマッピングがない場合は、シャードが空であることを願っているので、これは安全な削除方法です)データ - 最後の部分はあなたの責任ですが、シャードマップマネージャーはそれを確認できません)。

この時点でデータベースを既に削除しているので、代わりにシャードマップマネージャからRecoveryManager.DetachShardを使用してシャードデータベースを削除できます。そのシャードへのすべてのマッピングが削除されるため、これは通常危険です。そのため、DeleteShardが優先されます。

したがって、同じ名前の新しいデータベースを作成する場合は、ShardMap.CreateShardを呼び出して、そのシャードdbにシャーディングスキーマを作成し、そのシャードdbをシャードマップマネージャに追加する必要があります。しかし、あなたはこれを呼ばなかったので、シャーディングスキーマは作成されませんでした。

0

をあなたはシャーディングをサポートするために、テーブルとストアドプロシージャを作成するためにCreateShardを呼び出す必要がありシャードデータベースを作成した後(以前DeleteShardまたはDetachShardを呼び出していませんでした場合。CreateShardは失敗することに注意してください)。ここでは、Shard作成クラスのコードスニペットを示します。データベースが作成されたら、それを実行します。

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を呼び出すことができます。

関連する問題