2016-10-17 3 views
0

Ich erstellte eine MVC-Anwendung mit Visual Studio 2013 und ohne Probleme mit unserem Azure AD Tenant verbunden. Plötzlich bekomme ich einen Fehler:Azure AD mit Visual Studio Verletzung der PRIMARY KEY-Einschränkung

Verletzung der PRIMARY KEY-Einschränkung 'PK_dbo.Tenants'. Kann keinen doppelten Schlüssel in Objekt 'dbo.Tenants' einfügen. Der doppelte Schlüsselwert ist (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX). Die Anweisung wurde beendet.

Der Mandantenschlüssel ist die Mandanten-ID unserer Organisation.

Diese Anwendung befindet sich seit über einem Monat ohne Probleme bis heute Morgen.

Der Fehler tritt in dieser Funktion, die erzeugt wurde, wenn die Anwendung erstellt wurde:

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(); 
      } 
     } 
    } 

Antwort

1

Ihr Code neue Mieter schafft, ohne vorher zu überprüfen, ob sie bereits vorhanden ist. Bei einer Schätzung hat sich das System noch nie mit einer Mandanten-ID beschäftigt, die mit mehr als einer IssuingAuthority verknüpft ist.

die sofortige Problem zu beheben, überprüfen Sie, ob der Mieter bereits vorhanden ist, wie folgt aus (beachten Sie, ich habe diesen Code nicht getestet):

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

Danke. Das schien das Problem zu beheben. Irgendeine Idee, warum das zufällig angefangen hätte zu passieren? –

+0

@KevinKulla Der Code ging davon aus, dass die Mandanten-ID immer eindeutig war und niemals wiederverwendet werden würde, da sie immer eine Einfügung in die Tenants-Tabelle vornahm. Dies scheint nicht der Fall zu sein - vielleicht haben Mieter-IDs eine Obergrenze überschritten und werden nun wiederverwendet? –

Verwandte Themen