2014-04-07 4 views
12

Ich habe ein Azure Mobile Services-Projekt (C# -Backend), das ich kürzlich erstellt und an eine Azure SQL-Datenbank angehängt habe. Ich habe versucht, Code-First-Migrationen für diese Backing-Datenbank zu aktivieren, aber es werden Fehler ausgegeben, wenn ich versuche, die Datenbank zu aktualisieren.Fehler beim Aktivieren von Code-First-Migrationen auf der Datenbank für mobile Dienste

Ich habe alle herkömmlichen Schritte durchlaufen, um Migrationen zu ermöglichen (Enable-Migrations, Add-Migration). Aber wenn ich versuche, Update-Datenbank, gibt es den folgenden Fehler zurück:

Cannot create more than one clustered index on table 'dbo.Appointments'. Drop the existing clustered index 'PK_dbo.Appointments' before creating another.

Warum passiert das? Es gibt keine Tabellen in meiner Datenbank, und das Projekt ist so ziemlich der Standard.

Antwort

3

Ich hatte gerade das gleiche Problem.

Es durch die Definition von EntityData verursacht wird, die unsere Basisklasse:

public class OrgTest : EntityData 
{ 
    public string Prop1 { get; set; } 
} 

ich EntityData mit meiner eigenen Implementierung „CustomEntity“ ersetzt, wo ich das Attribut entfernt [Index (IsClustered = true)] auf dem CreatedAt Säule:

public abstract class CustomEntity : ITableData 
{ 
    // protected CustomEntity(); 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [TableColumn(TableColumnType.CreatedAt)] 
    public DateTimeOffset? CreatedAt { get; set; } 
    [TableColumn(TableColumnType.Deleted)] 
    public bool Deleted { get; set; } 
    [Key] 
    [TableColumn(TableColumnType.Id)] 
    public string Id { get; set; } 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    [TableColumn(TableColumnType.UpdatedAt)] 
    public DateTimeOffset? UpdatedAt { get; set; } 
    [TableColumn(TableColumnType.Version)] 
    [Timestamp] 
    public byte[] Version { get; set; } 
} 

und ich erben jetzt von dieser:

public class OrgTest : CustomEntity // EntityData 
{ 
    public string Prop1 { get; set; } 
} 

Wahrscheinlich werde ich weiter Probleme haben, aber vorläufig kann ich mein Modell erstellen! Hoffe du kannst auch so starten!

+0

Ich endete am Ende nur mit einem Web-API-Projekt. Das ist vielleicht die richtige Antwort, aber ich habe keine Möglichkeit, die Lösung zu bestätigen. –

+0

Es funktioniert nach dem Tutorial, das ich vorher gepostet habe. Es ist jedoch wichtig, das Projekt lokal auszuführen (F5) ** bevor ** Sie veröffentlichen und die Änderungen in Ihrer WebApiConig-Klasse gemäß Punkt 6 des Lernprogramms vornehmen und automatische Migrationen aktivieren (Konfigurationsklasse innerhalb Ihres Migrationsordners)). Da ich diesen Workflow verwende, hatte ich keine weiteren Probleme, außer einmal, wenn die Datenbankzugriffsrechte nicht richtig eingestellt waren. Aber das scheint jetzt auch behoben zu sein. – awsomedevsigner

+3

Ich habe ein Problem damit, wenn ich versuche, eine Zeile in eine Tabelle mit dieser CustomEntity einzufügen, erhalte ich die folgende Fehlermeldung: 'Der Vorgang ist mit dem folgenden Fehler fehlgeschlagen: 'Der Wert NULL kann nicht in die Spalte' CreatedAt 'eingefügt werden ' –

5

Ich kämpfte heute für ein paar Stunden mit diesem Problem. Bis ich diesen Link gefunden:

How to make data model changes to a .NET backend mobile service

Wenn Sie die Anweisungen befolgen, wird es auf jeden Fall funktionieren. Die Hauptsache ist, dass die Migration stattfindet, wenn Sie während einer lokalen Debugging-Sitzung F5 drücken.

+0

Dies ist die richtige Antwort. Wenn ich die Antwort unten versuchte, würde der Klient immer "Schlechte Anfrage" Fehler werfen, wenn ich es abfragen würde, obwohl ich Fiddler verwenden könnte, um Daten herunterzuziehen. Also habe ich meine Datenbank weggeblasen, von EntityData geerbt und dann die automatischen Migrationen benutzt, um die Tabellen zu erstellen. Es klappt!!! – Stephen

+2

Link scheint verschoben zu sein [https://github.com/Azure/azure-mobile-services/blob/master/docs/mobile-services-dotnet-backend-how-to-use-code-first- migrations.md). – Quantic

3

diesen Artikel:

avoid nightmares using ef first migration in azure mobile services

EntityData einen Cluster Index-zu CreateAt definieren und Id ist standardmäßig ein Cluster-Index, auf diese Weise einen Fehler liefern und Sie sollten nur einen definieren.

+0

Beachten Sie, dass der Artikel, auf den verwiesen wird, mit dem Text beginnt: Die Standardinitialisierungen haben sich etwas geändert, seit das .NET-Backend den Meilenstein "Allgemeine Verfügbarkeit" erreicht hat. Die neuesten Informationen finden Sie in [So ändern Sie Datenmodelländerungen an einem mobilen .NET-Backend-Dienst] (https://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-how to-use-code-first-migrations /), auf den in [awsomedevdesigners frühere Antwort] verwiesen wird (http://stackoverflow.com/a/23429333/575530). – dumbledad

8

Wenn Sie diesen Fehler in update-database nach dem Erstellen der Migrationsklasse erhalten, dann schauen Sie sich @ Ihre Migrationsklasse an. Die Migrationsklasse übernimmt den primären gruppierten Index. Entfernen Sie das also von der up() -Methode.

.PrimaryKey (t => t.Id, gruppiert: falsch) .Index (t => t.CreatedAt, clustered: true);

Wenn Sie es auf einem azure mobilen Dienst verwenden, rufen Sie 'update-database' nicht manuell auf. refer http://azure.microsoft.com/en-in/documentation/articles/mobile-services-dotnet-backend-how-to-use-code-first-migrations/

+0

Dies führt nicht mehr zu etwas Nützlichem. Versuchte Suche auf der azurblauen Seite, aber keine Freude ... – silverfox1948

11

Einige der Antworten über das Ableiten von einer benutzerdefinierten Entitätsklasse funktionieren, aber sie sind nicht die ideale Lösung. Wie das EF-Team (und andere) bereits erwähnt haben, müssen Sie diese Zeile einfach zu Ihrem Kontextkonfigurationskonstruktor hinzufügen.

Dies wird Ihre Fehler beim Erstellen von Migrationen entfernen und Ihnen ermöglichen, die Datenbank über den Powershell-Befehl zu aktualisieren.

+0

Diese Lösung funktionierte für mich. Ich hatte die App viele Male auf dem Server installiert und alle Tabellen gelöscht, um von vorne zu beginnen - bevor dieser Fehler plötzlich auftrat. Das Hinzufügen dieser Zeile und die erneute Bereitstellung funktionierten problemlos - danach wurden alle meine Tabellen neu erstellt. Vielen Dank. – Artemious

+0

Diese Lösung hat perfekt funktioniert. Ich danke dir sehr. – TRAL

+1

Das geht in Ihre "Configuration.cs" -Datei. interne versiegelte Klasse Konfiguration: DbMigrationsConfiguration \t { \t \t öffentliche Konfiguration() \t \t { \t \t \t AutomaticMigrationsEnabled = true; \t \t \t SetSqlGenerator ("System.Data.SqlClient", neu EntityTableSqlGenerator()); \t \t} – silverfox1948

Verwandte Themen