所以,我创建了一个天蓝色的移动服务,下载了一个项目并运行它。
首次启动后,我在数据库中看到了一些新表:TodoItems
(包含2个项目)和_MigrationHistory
。到目前为止一切都很好。
现在,我想添加一个额外的表格。
MyModel:EntityData { public string MyData { get; set; }
MyModelController:TableController<MyModel>
,它是TodoItemController的副本,其中TodoItem
替换为MyModel
public DbSet<MyModel> MyModels { get; set; }
添加到MyProjectContext.cs context.Set<MyModel>().Add(new MyModel{MyData= "test"});
我会忘记一些事吗?
删除所有表并重新发布并运行我的移动应用程序后,我收到 MobileServiceInvalidOperationException 异常,我的表为空(即使TodoItems
为空)。
编辑:我不确定问题的核心在哪里。如果要向移动应用添加一行
private IMobileServiceTable<MyModel> myItemsTable = App.MobileService.GetTable<MyModel>();
它会抛出InvalidOperationException。但是MyModels
表存在于db中,我可以通过db manager看到它...
EDIT2 :
TodoItems
(包含2个项目)和_MigrationHistory
。public DbSet<MyModel> MyModels { get; set; }
,删除了db中的所有表,运行app,现在我看到3个表:MyModels
,TodoItems
(包含2个项目)和_MigrationHistory
。context.Set<MyModel>().Add(new MyModel{MyData= "test"});
时 - 此时播种出错:我看到3个表MyModels
,TodoItems
和_MigrationHistory
,但TodoItems
为空现在答案 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