我创建了一个Azure移动应用程序,然后下载了生成的后端和移动应用程序。当我启动它时,它成功地获得了数据库中的 2 个待办事项。但是,一旦我添加如下用户模型 - 它就会停止在移动应用程序中获取待办事项。我不知道是什么导致了冲突。
- 如果我删除用户模型和引用,我可以再次在移动应用程序上检索待办事项
当我从数据库上下文中注释掉这一行时,它再次工作:
//public DbSet<User> Users { get; set; }
启动:
public partial class Startup
{
public static void ConfigureMobileApp(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
//For more information on Web API tracing, see http://go.microsoft.com/fwlink/?LinkId=620686
config.EnableSystemDiagnosticsTracing();
new MobileAppConfiguration()
.UseDefaultConfiguration()
.ApplyTo(config);
// Map routes by attribute
config.MapHttpAttributeRoutes();
// Use Entity Framework Code First to create database tables based on your DbContext
Database.SetInitializer(new AuthApp231Initializer());
// To prevent Entity Framework from modifying your database schema, use a null database initializer
// Database.SetInitializer<AuthApp231Context>(null);
MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();
if (string.IsNullOrEmpty(settings.HostName))
{
// This middleware is intended to be used locally for debugging. By default, HostName will
// only have a value when running in an App Service application.
app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
{
SigningKey = ConfigurationManager.AppSettings["SigningKey"],
ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
TokenHandler = config.GetAppServiceTokenHandler()
});
}
app.UseWebApi(config);
}
}
public class AuthApp231Initializer : CreateDatabaseIfNotExists<AuthApp231Context>
{
protected override void Seed(AuthApp231Context context)
{
List<TodoItem> todoItems = new List<TodoItem>
{
new TodoItem { Id = Guid.NewGuid().ToString(), Text = "First item", Complete = false },
new TodoItem { Id = Guid.NewGuid().ToString(), Text = "Second item", Complete = false },
};
foreach (TodoItem todoItem in todoItems)
{
context.Set<TodoItem>().Add(todoItem);
}
/*List<User> users = new List<User>
{
new User { Id = Guid.NewGuid().ToString(), Username = "adrian", Password = "supersecret" }
};
foreach (User user in users)
{
context.Set<User>().Add(user);
}*/
base.Seed(context);
}
}
数据对象 :
public class User :EntityData
{
public string Username { get; set; }
public string Password { get; set; }
}
上下文:
public class AuthApp231Context : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to alter your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
private const string connectionStringName = "Name=MS_TableConnectionString";
public AuthApp231Context() : base(connectionStringName)
{
}
public DbSet<TodoItem> TodoItems { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(
new AttributeToColumnAnnotationConvention<TableColumnAttribute, string>(
"ServiceTableColumn", (property, attributes) => attributes.Single().ColumnType.ToString()));
}
}
据我所知,示例移动应用程序后端项目仅包含TodoItem
模型,当您运行项目时,将触发Database.SetInitializer(new AuthApp231Initializer())
并在数据库不存在时创建数据库和TodoItem
表。如果在初始化数据库后添加其他数据模型,则需要迁移数据库。
注意:您可以利用Add-Migration
来添加自定义迁移,并使用Update-Database
使数据库保持最新。此外,还可以利用 MigrateDatabaseToLatestVersion
初始值设定项自动升级数据库。
有关如何启用 EF 代码优先迁移的更多详细信息,可以参考此官方教程。
要将模型添加到现有项目,您需要执行以下操作:
- 添加数据传输对象
- 将数据库集添加到上下文中
- 为新 DTO 添加表控制器
- 针对目标数据库设置并执行迁移,或者在数据库中创建相应的表
描述了你已经完成了#1和#2。 您没有表明您已经完成了#3或#4。
欲了解更多信息,请查看我的书 http://aka.ms/zumobook - 特别是第3章。