【问题标题】:Extending base mobile azure sample (.net backend)扩展基本移动 Azure 示例(.net 后端)
【发布时间】:2014-07-29 13:28:49
【问题描述】:

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

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

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

我忘记了什么吗?

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

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

private IMobileServiceTable<MyModel> myItemsTable = App.MobileService.GetTable<MyModel>();

它会抛出 InvalidOperationException。但是MyModels 表存在于数据库中,我可以通过数据库管理器查看...

EDIT2

  • 好的,我删除了所有附加代码(使用 MyModels)并删除了 db 中的所有表。重新发布移动服务,运行应用程序,我再次看到 2 个表格:TodoItems(包含 2 个项目)和 _MigrationHistory
  • 现在,我在 MyProjectContext.cs 中添加了行 public DbSet&lt;MyModel&gt; MyModels { get; set; },删除了 db 中的所有表,运行应用程序,现在我看到了 3 个表:MyModelsTodoItems(包含 2 个项目)和 _MigrationHistory。李>
  • 当我添加context.Set&lt;MyModel&gt;().Add(new MyModel{MyData= "test"}); 行时 - 此刻播种出错:我看到 3 个表 MyModelsTodoItems_MigrationHistory,但 TodoItems 现在是空的。

【问题讨论】:

    标签: c# .net mobile azure service


    【解决方案1】:

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

    固定线路是context.Set&lt;MyModel&gt;().Add(new MyModel{MyData= "test", Id = "666"});

    EDIT1:我遇到的另一个问题:如果应用程序的var myTable = MobileService.GetTable&lt;MyModel&gt;(); 行有异常,请确保将Id 字段添加到模型中。

    【讨论】:

      【解决方案2】:

      这比它应该的要复杂一些,但错误的原因是初始化程序没有看到 MyModel 表不存在——只是 TodoItem 模型没有改变。

      最简单的解决方法是,您只需将 MyModel DbSet 添加到现有的 todoitem 上下文,而不是添加新的 MyModelContext,使其看起来像这样:

          public DbSet<TodoItem> TodoItems { get; set; }
      
          public DbSet<MyModel> MyModels { get; set; }
      

      那么你也可以只有一个 DB 初始化器,例如看起来像这样:

          protected override void Seed(henrikntest13Context context)
          {
              List<TodoItem> todoItems = new List<TodoItem>
              {
                  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<TodoItem>().Add(todoItem);
              }
      
              List<MyModel> myModels = new List<MyModel>
              {
                  new MyModel { Id = "1", MyData = "First Item"},
                  new MyModel { Id = "2", MyData = "Second Item"},
              };
      
              foreach (MyModel model in myModels)
              {
                  context.Set<MyModel>().Add(model);
              }
      
              base.Seed(context);
          }
      

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

      public class MyInitializer : ClearDatabaseSchemaAlways<todoitemContext>
      

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

      希望这会有所帮助!

      亨里克

      【讨论】:

      • 您好,感谢您的回答。但我实际上没有看到我的代码和你的代码之间的区别。我还添加了一个public DbSet&lt;MyModel&gt; MyModels 并像context.Set&lt;MyModel&gt;().Add(new MyModel{MyData= "test"}); 一样填充它 - 您的示例的简化版本。请您再强调一次差异:恐怕我没听懂?
      • 更新了一个问题。移动应用程序中的那个异常表示它看不到表格,但表格存在......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多