扩展基础移动azure样本(.net后端)

所以,我创建了一个azure色的移动服务,下载了一个项目并运行它。 第一次启动后,我在DB中看到一些新表: TodoItems (有2个项目)和_MigrationHistory 。 到现在为止还挺好。

现在,我想添加一个额外的表格。

  1. 我正在制作新模型MyModel:EntityData { public string MyData { get; set; } MyModel:EntityData { public string MyData { get; set; }
  2. 制作一个新的控制器MyModelController:TableController ,它是TodoItemController的副本,其中TodoItemTodoItem取代
  3. 添加了public DbSet MyModels { get; set; } public DbSet MyModels { get; set; } 到MyProjectContext.cs
  4. 添加到WebApiConfig的行context.Set().Add(new MyModel{MyData= "test"});

我忘了什么吗?

删除所有表并重新发布和运行我的移动应用程序后,我收到MobileServiceInvalidOperationExceptionexception,我的表为空(即使TodoItems为空)。

编辑 :我不确定问题的核心在哪里。 如果要向移动应用添加一行

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

它会抛出InvalidOperationException。 但MyModels表存在于db中,我可以通过db manager看到它…

编辑2

  • 好的,我删除了所有其他代码(使用MyModels)并删除了db中的所有表。 重新发布移动服务,运行应用程序,我再次看到2个表: TodoItems (有2个项目)和_MigrationHistory
  • 现在,我添加了行public DbSet MyModels { get; set; } public DbSet MyModels { get; set; } 到MyProjectContext.cs,删除db中的所有表,运行app,现在我看到3个表: MyModelsTodoItems (带2个项目)和_MigrationHistory
  • 当我添加行context.Set().Add(new MyModel{MyData= "test"}); – 在这一刻播种出错之后:我看到3个表MyModelsTodoItems_MigrationHistory ,但TodoItems现在是空的。

问题出在行context.Set().Add(new MyModel{MyData= "test"}); 。 我忘了初始化Id :认为它会自动增加。

固定行是context.Set().Add(new MyModel{MyData= "test", Id = "666"});

EDIT1:我遇到的另一个问题:如果应用程序行中有exception,则var myTable = MobileService.GetTable(); ,请务必将Id字段添加到模型中。

这比它应该更棘手,但错误的原因是初始化程序没有看到MyModel表不存在 – 只是TodoItem模型没有改变。

最简单的解决方法是,只需将MyModel DbSet添加到现有的todoitem上下文,而不是添加新的MyModelContext,使其如下所示:

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

然后你也可以只有一个DB初始化程序,例如看起来像这样:

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

一次运行此操作时,您可能必须使用ClearDatabaseSchemaAlways作为基类来强制模型使用两个实体进行更新:

 public class MyInitializer : ClearDatabaseSchemaAlways 

但从那时起,您可以再次使用ClearDatabaseSchemaAIfModelChanges。

希望这可以帮助!

亨里克