2016-10-17 16 views
0

Visual Studio 2013を使用してMVCアプリケーションを作成し、Azure AD Tenantに問題なく接続しました。今朝突然、エラーが発生します:Visual Studioを使用したAzure AD PRIMARY KEY制約の違反

PRIMARY KEY制約 'PK_dbo.Tenants'に違反しています。オブジェクト 'dbo.Tenants'に重複キーを挿入できません。重複するキー値は(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX)です。 ステートメントが終了しました。

テナントキーは、私たちの組織のテナントIDです。

このアプリケーションは、今朝まで問題なしで1ヶ月以上開発されています。

エラーは、アプリケーションが作成されたときに生成されたこの機能で発生します。

public static void RefreshKeys(string metadataLocation) 
    { 
     IssuingAuthority issuingAuthority = ValidatingIssuerNameRegistry.GetIssuingAuthority(metadataLocation); 

     bool newKeys = false; 
     foreach (string thumbprint in issuingAuthority.Thumbprints) 
     { 
      if (!ContainsKey(thumbprint)) 
      { 
       newKeys = true; 
       break; 
      } 
     } 

     if (newKeys) 
     { 
      using (TenantDbContext context = new TenantDbContext()) 
      { 
       context.IssuingAuthorityKeys.RemoveRange(context.IssuingAuthorityKeys); 
       foreach (string thumbprint in issuingAuthority.Thumbprints) 
       { 
        context.IssuingAuthorityKeys.Add(new IssuingAuthorityKey { Id = thumbprint }); 
       } 
       foreach (string issuer in issuingAuthority.Issuers) 
       { 
        context.Tenants.Add(new Tenant { Id = issuer.TrimEnd('/').Split('/').Last() }); 
       } 
       context.SaveChanges(); 
      } 
     } 
    } 

答えて

1

あなたのコードは、彼らがすでに存在する場合、最初にチェックせずに新しいテナントを作成しています。推測すると、システムは、1つ以上のIssuingAuthorityに関連付けられているテナントIDを扱ったことがありません。

、すぐに問題を解決するテナントが既に存在するかどうかを確認、この(私はこのコードをテストしていません注意してください)のようにするには、次の

public static void RefreshKeys(string metadataLocation) 
{ 
    IssuingAuthority issuingAuthority = ValidatingIssuerNameRegistry.GetIssuingAuthority(metadataLocation); 

    bool newKeys = false; 
    foreach (string thumbprint in issuingAuthority.Thumbprints) 
    { 
     if (!ContainsKey(thumbprint)) 
     { 
      newKeys = true; 
      break; 
     } 
    } 

    if (newKeys) 
    { 
     using (TenantDbContext context = new TenantDbContext()) 
     { 
      context.IssuingAuthorityKeys.RemoveRange(context.IssuingAuthorityKeys); 
      foreach (string thumbprint in issuingAuthority.Thumbprints) 
      { 
       context.IssuingAuthorityKeys.Add(new IssuingAuthorityKey { Id = thumbprint }); 
      } 

      // Get the Tenant IDs we have been supplied with 
      IEnumerable<string> tenantIds = issuingAuthority.Issuers.Select(i => i.TrimEnd('/').Split('/').Last()); 

      // Exclude any that already exist in the database 
      List<string> newTenantIds = tenantIds.Except(context.Tenants.Select(t => t.Id)).ToList(); 

      // Add only the new Tenant instances to the database 
      foreach (string tenantId in newTenantIds) 
      { 
       context.Tenants.Add(new Tenant { Id = tenantId }); 
      } 
      context.SaveChanges(); 
     } 
    } 
} 
+0

はありがとうございます。それは問題を解決するように見えました。それがなぜランダムに起こったのだろうか? –

+0

@KevinKullaコードは、テナントIDが常に一意であり、常にテナント表に挿入を実行したので、再使用されないと想定していました。これはそうではないようです - おそらくテナントIDがある上限を覆い、現在再利用されていますか? –

関連する問題