Extension de l’échantillon azure mobile de base (backend)

Alors, je crée un service mobile azure, télécharge un projet et l’exécute. Après le premier lancement, je vois de nouvelles tables dans la firebase database: TodoItems (avec 2 éléments) et _MigrationHistory . Jusqu’ici tout va bien.

Maintenant, j’aimerais append une table supplémentaire.

  1. Je MyModel:EntityData { public ssortingng MyData { get; set; } nouveau modèle MyModel:EntityData { public ssortingng MyData { get; set; } MyModel:EntityData { public ssortingng MyData { get; set; }
  2. Création d’un nouveau contrôleur MyModelController:TableController qui est une copie de TodoItemController, TodoItem étant remplacé par MyModel
  3. public DbSet MyModels { get; set; } ajouté public DbSet MyModels { get; set; } public DbSet MyModels { get; set; } public DbSet MyModels { get; set; } à MyProjectContext.cs
  4. Ajout à WebApiConfig d’un context.Set().Add(new MyModel{MyData= "test"});

Est-ce que j’oublie quelque chose?

Après avoir supprimé toutes les tables et republié et exécuté mon application mobile, j’obtiens une exception MobileServiceInvalidOperationException et mes tables sont vides (même si TodoItems est vide).

EDIT : Je ne sais pas où est le cœur du problème. Si append une ligne à l’application mobile

 private IMobileServiceTable myItemsTable = App.MobileService.GetTable(); 

Cela lancerait InvalidOperationException. Mais la table MyModels existe dans une firebase database, je peux la voir via le gestionnaire de bases de données …

EDIT2 :

  • D’accord, j’ai supprimé tout le code supplémentaire (avec MyModels) et toutes les tables de la firebase database. TodoItems service mobile, lancez l’application et encore une fois, je vois 2 tables: TodoItems (avec 2 éléments) et _MigrationHistory .
  • Maintenant, j’ai ajouté la ligne public DbSet MyModels { get; set; } public DbSet MyModels { get; set; } public DbSet MyModels { get; set; } à MyProjectContext.cs, a supprimé toutes les tables de la firebase database, lance l’application et maintenant je vois 3 tables: MyModels , TodoItems (avec 2 éléments) et _MigrationHistory .
  • Lorsque j’ai ajouté le context.Set().Add(new MyModel{MyData= "test"}); ligne context.Set().Add(new MyModel{MyData= "test"}); – après ce moment, l’ensemencement a mal tourné: je vois trois tableaux MyModels , TodoItems et _MigrationHistory , mais TodoItems est vide.

Le problème était context.Set().Add(new MyModel{MyData= "test"}); ligne context.Set().Add(new MyModel{MyData= "test"}); . J’ai oublié d’initialiser Id : je pensais que ce serait auto-incrémenté.

La ligne fixe correspond au context.Set().Add(new MyModel{MyData= "test", Id = "666"});

EDIT1: juste un autre problème que j’ai rencontré: s’il y a une exception dans la ligne de l’application var myTable = MobileService.GetTable(); , assurez-vous que vous avez ajouté le champ Id à votre modèle.

C’est un peu plus délicat que cela ne devrait être, mais la raison de l’erreur est que l’initialiseur ne voit pas que la table MyModel n’est pas là, mais que le modèle TodoItem n’a pas changé.

La solution de contournement la plus simple consiste à append à votre DbSet MyModel un contexte todoitem existant au lieu d’append un nouveau MyModelContext pour qu’il ressemble à ceci:

  public DbSet TodoItems { get; set; } public DbSet MyModels { get; set; } 

Ensuite, vous pouvez également n’avoir qu’un initialiseur de firebase database, par exemple, ressemblant à ceci:

  protected override void Seed(henrikntest13Context context) { List todoItems = new List { new TodoItem { Id = "1", Text = "First item", Complete = false }, new TodoItem { Id = "2", Text = "Second item", Complete = false }, }; foreach (TodoItem todoItem in todoItems) { context.Set().Add(todoItem); } List myModels = new List { new MyModel { Id = "1", MyData = "First Item"}, new MyModel { Id = "2", MyData = "Second Item"}, }; foreach (MyModel model in myModels) { context.Set().Add(model); } base.Seed(context); } 

Lors de la première exécution, vous devrez peut-être utiliser ClearDatabaseSchemaAlways comme classe de base pour forcer le modèle à être mis à jour avec les deux entités:

 public class MyInitializer : ClearDatabaseSchemaAlways 

Mais à partir de ce moment-là, vous pourrez simplement utiliser à nouveau ClearDatabaseSchemaAIfModelChanges.

J’espère que cela t’aides!

Henrik