无法在 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 &lt;string&gt; 命令。否则,请使用-ConfigurationTypeName &lt;string&gt; 命令,确保您的配置类具有不同的名称。另外,请确保您的QuestionContext 的配置是公开的。 More information here.

此外,请确保在您运行项目时(在您当前的构建配置下)连接字符串指向正确的数据库。

最后,我会推荐你​​Enable-Migrations,因为你这样做会导致数据丢失。

【讨论】:

我已经启用了自动迁移,更改连接字符串对解决问题没有任何帮助。我设法通过将我所有的数据库集移动到 applicationdbcontext 并完全废弃 questioncontext 来解决它。 您是否尝试告诉 Upgrade-Migration 您要更新哪个上下文?

以上是关于无法在 mvc 5 项目中添加新模型和更新数据库?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 asp.net MVC-5 项目中的我的 aspnet 数据库中添加新的自定义表吗

在 MVC3、C# 中使用视图模型中的新数据更新视图

无法将数据添加到数据库 MVC 5 代码优先方法

在 EF 6 和 MVC 5 中使用 Code First 方法将新表添加到现有数据库

如何在mvc中的模型中添加多个项目

猫鼬更新数组并添加新元素