扩展基于移动的Azure示例(.NET后端)

3
所以,我创建了一个Azure移动服务,下载了一个项目并运行它。首次启动后,我在数据库中看到了一些新表: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. 在WebApiConfig中添加一行context.Set<MyModel>().Add(new MyModel{MyData= "test"});
我忘记了什么吗?
删除所有表并重新发布和运行我的移动应用程序后,我收到了MobileServiceInvalidOperationException异常,并且我的表为空(甚至TodoItems也为空)。 编辑:我不确定问题的核心在哪里。如果要向移动应用程序添加一行
private IMobileServiceTable<MyModel> myItemsTable = App.MobileService.GetTable<MyModel>();

它会抛出InvalidOperationException异常。但是MyModels表存在于数据库中,我可以通过数据库管理器看到它...
编辑2: - 好的,我删除了所有与MyModels相关的额外代码,并删除了数据库中的所有表。重新发布移动服务,运行应用程序,现在我看到了2个表:TodoItems(有2个项目)和_MigrationHistory。 - 现在,我在MyProjectContext.cs中添加了一行public DbSet MyModels { get; set; },删除了数据库中的所有表,运行应用程序,现在我看到了3个表:MyModels,TodoItems(有2个项目)和_MigrationHistory。 - 当我添加了context.Set().Add(new MyModel{MyData= "test"});这行代码后,种子播种出现了问题:我现在看到了3个表MyModels,TodoItems和_MigrationHistory,但是TodoItems现在为空。
2个回答

2
问题出在这一行代码:context.Set<MyModel>().Add(new MyModel{MyData= "test"}); 我忘记初始化 Id,认为它会自动增加。
修改后的代码是:context.Set<MyModel>().Add(new MyModel{MyData= "test", Id = "666"}); 编辑1:我遇到另一个问题:如果在应用程序的这一行代码中发生异常 var myTable = MobileService.GetTable<MyModel>(); ,请确保将Id字段添加到您的模型中。

0

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

最简单的解决方法是将 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。

希望这可以帮助您!

亨利克


嗨,谢谢你的回答。但实际上我并没有看到我的代码和你的有什么区别。我也添加了一个public DbSet<MyModel> MyModels并像这样填充它:context.Set<MyModel>().Add(new MyModel{MyData= "test"}); - 这是你示例的简化版本。你能再次指出其中的区别吗?我担心我没有理解它们。 - Vitalii Vasylenko
更新了一个问题。移动应用程序中的异常表示它无法看到一个表,但该表确实存在... - Vitalii Vasylenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接