无法在 mvc 5 项目中添加新模型和更新数据库?
Posted
技术标签:
【中文标题】无法在 mvc 5 项目中添加新模型和更新数据库?【英文标题】:Can't add new model and update database in mvc 5 project? 【发布时间】:2015-03-05 18:00:21 【问题描述】:我正在处理的当前项目存在问题。它可以正常工作,并且可以使用当前的类和功能正常运行。我的问题是我似乎无法添加另一个模型,它是相应的控制器和视图并让它实际工作。
通常我会简单地在文件夹中添加一个新模型类,使用新模型作为数据类型的 dbset 更新我的 dbcontext 类。然后在包管理器控制台中写入“update-database -force”,它将应用自动迁移。但出于某种我似乎无法理解的奇怪原因,它根本不会再这样做了。
相反,在我创建模型并添加 dbset 然后尝试更新数据库之后,它运行更新正常,但它没有添加任何新的迁移。有趣的是,当我运行项目时,当您忘记更新推荐代码优先迁移等的数据库时,您总是会遇到通常的错误。
我尝试检查我的配置文件,似乎上下文键设置为 applicationuser 而不是正确的 dbcontext 类,我感觉这就是它没有检测到任何更改的原因(通常它自己会解决这个问题?)。但是当我尝试将其更改为正确的并再次更新数据库时,它给了我一个错误,说数据库中已经有一些关于 asproles 的内容?
我完全迷失了,如果有经验的 vs13 用户能给我任何意见,我将不胜感激。
编辑: 我应该提到我最近一直在研究身份框架,这可能是它自动更改上下文键的原因?但在此期间,我的任何现有课程都没有遇到任何问题。
新编辑(29-01-2015) 配置文件相关部分:
internal sealed class Configuration : DbMigrationsConfiguration<MEV3.Models.ApplicationDbContext>
public Configuration()
AutomaticMigrationsEnabled = true;
ContextKey = "MEV3.Models.QuestionContext";
protected override void Seed(MEV3.Models.ApplicationDbContext context)
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person FullName = "Andrew Peters" ,
// new Person FullName = "Brice Lambson" ,
// new Person FullName = "Rowan Miller"
// );
this.AddUserAndRoles();
我的 QuestionContext 文件:
namespace MEV3.Models
public class QuestionContext : DbContext
public DbSet<ExamSet> ExamSets get; set;
public DbSet<BlanketSet> BlanketSets get; set;
public DbSet<LooseQuestionCase> LooseQuestionCases get; set;
public DbSet<Medcase> Medcases get; set;
public DbSet<Question> Questions get; set;
public DbSet<QuestionChoice> QuestionChoices get; set;
public DbSet<QuestionBeforeAfter> QuestionBeforeAfters get; set;
public DbSet<Answer> Answers get; set;
public DbSet<Tag> Tags get; set;
public DbSet<Category> Categories get; set;
public DbSet<Institution> Institutions get; set;
public DbSet<ExamType> ExamTypes get; set;
public DbSet<NewsArticle> NewsArticles get; set;
//public DbSet<TaskRecord> TaskRecords get; set;
//protected override void OnModelCreating(DbModelBuilder modelBuilder)
//
// modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
//
我的 ApplicationDbContext 文件:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
public ApplicationDbContext()
: base("DefaultConnection")
public DbSet<TaskRecord> TaskRecords get; set;
当我将 contextkey 设置为我的 QuestionContext 并尝试更改该 dbset 中的任何模型时,它会给我一个关于任务记录的错误(这很奇怪,因为它们在 applicationdbcontext 类中)。
这意味着如果我尝试更改 QuestionContext 中的模型,我将无法成功更新数据库。
如果我将 contextkey 设置为 ApplicationDbContext,我可以成功地对 applicationdbcontext 中的任何内容进行更改,但它不会注册在 QuestionContext 中的任何模型中所做的任何更改。
我很茫然,它现在的工作方式似乎只能将新模型添加到 applicationdbcontext 或更改其中的模型,无法返回并更改 questioncontext 中的任何内容。有什么想法吗?
顺便说一句,自动迁移已在两个上下文中成功启用。在我开始摆弄身份框架之前,我已经成功地使用了这个设置。
【问题讨论】:
如果你在更新前运行Add-Migration [someNameHere]
会发生什么?
它只是给了我同样的错误信息,要求我查看代码优先迁移:/
你能显示一些代码吗?特别是迁移文件夹中的 Context 和 Configuration.cs
文件。
我实际上设法通过将 DbSet 放置在 applicationdbcontext 模型类中来解决这个问题,这并不重要,因为它只是它所持有的一些统计数据。但我不确定为什么我首先会遇到问题。
如果您发布一些代码,也许有人可以为您提供一些启示?
【参考方案1】:
您的应用程序有多个上下文,因此您应该告诉Update-Migration
从哪个配置中选择。如果两个上下文在不同的项目中,可以使用-ProjectName <string>
命令。否则,请使用-ConfigurationTypeName <string>
命令,确保您的配置类具有不同的名称。另外,请确保您的QuestionContext
的配置是公开的。 More information here.
此外,请确保在您运行项目时(在您当前的构建配置下)连接字符串指向正确的数据库。
最后,我会推荐你Enable-Migrations
,因为你这样做会导致数据丢失。
【讨论】:
我已经启用了自动迁移,更改连接字符串对解决问题没有任何帮助。我设法通过将我所有的数据库集移动到 applicationdbcontext 并完全废弃 questioncontext 来解决它。 您是否尝试告诉 Upgrade-Migration 您要更新哪个上下文?以上是关于无法在 mvc 5 项目中添加新模型和更新数据库?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 asp.net MVC-5 项目中的我的 aspnet 数据库中添加新的自定义表吗