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

时间:2014-07-29 13:28:49

标签: c# .net mobile azure service

所以,我创建了一个天蓝色的移动服务,下载了一个项目并运行它。 首次启动后,我在数据库中看到了一些新表:TodoItems(包含2个项目)和_MigrationHistory。到目前为止一切都很好。

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

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

    我会忘记一些事吗?

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

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

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

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

    EDIT2

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

2 个答案:

答案 0 :(得分:2)

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

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

EDIT1:我面临的另一个问题是:如果应用行[{1}}中有异常,请务必在模型中添加var myTable = MobileService.GetTable<MyModel>();字段。

答案 1 :(得分:0)

它比它应该有点棘手,但错误的原因是初始化程序没有看到MyModel表不存在 - 只有TodoItem模型没有&# 39;改变了。

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

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

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

然后你也可以只有一个数据库初始化程序,例如:

    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。

希望这有帮助!

的Henrik