【问题标题】:Scaffolding controller doesn't work with visual studio 2013 update 3 and 4脚手架控制器不适用于 Visual Studio 2013 更新 3 和 4
【发布时间】:2014-07-26 18:30:40
【问题描述】:

我无法在 Visual Studio 2013(更新 3 和 4)中构建控制器(带有视图的 MVC5 控制器,使用实体框架)。错误信息如下:

运行所选代码生成器时出错:

A configuration for type 'Library.Morthwind.Models.Catgeory' has already been added. To reference the existing configuration use the Entity<T>() or ComplexType<T>() methods

我通过从“Entity Framework Power Tools Beta 4”工具菜单中选择“逆向工程师代码优先”来创建模型。

关于什么可能导致此错误的任何想法?

【问题讨论】:

标签: c# entity-framework visual-studio


【解决方案1】:

我今天遇到了同样的问题。

我为我的一个模型类添加了一些自定义配置,以使用 fluent API 添加关系。这是在 OnModelCreating 覆盖中的 dbContext 类中指定的,使用以下内容:

modelBuilder.Configurations.Add(new OrderConfiguration());

注释掉以上行允许Controller 脚手架按预期运行。

VS 2013 更新 2 有一个问题,脚手架出现了一个无用的错误,没有进一步的信息。在已安装的 Update 3 中,它提供了足够的详细信息来追踪潜在问题。

杰夫。

【讨论】:

  • 这行得通。我在我的 DbContext 底部评论了 .Adds 并按照这篇文章的建议构建了该项目,并允许脚手架工作。我使用的是 LongLe 的 ODataControllerWithContext 模板。如果你指定了一个复数的控制器名称将会出现不匹配,如果是这样,修改类名或构造函数,任何适合你的。
  • 这个问题在更新 4 时仍然存在。有谁知道,是否有适合 MS 的错误提交?
  • 不要忘记在注释掉配置后“构建”你的项目。添加行。然后你可以尝试搭建你的控制器。如果不是,VS 脚手架仍然认为您有自定义配置。
  • 更新 5 仍然存在问题。但是,如果您按照@Bogac 的建议执行此解决方案并在您注释掉后重建。
【解决方案2】:

我也遇到过这个问题。 Jeff 的解决方案在某些情况下有效。但是随着我的 DbContext 随着更多需要映射键的模型的增长,我无法删除 Configurations.Add() 方法,因为我会收到 EF 找不到主键等错误...

我确实发现,通过将我的 DBContext 派生类更改为使用 IDbSet 属性而不是 DbSet,我可以很好地生成控制器和视图。但是,对我来说,这引入了另一个问题,IDbSet 不支持异步方法。

看来我既可以生成具有适当配置的非异步控制器,也可以生成没有配置类的异步方法。

如果您的上下文属性是 DbSet 类型,请尝试将它们更改为 IDbSet。如果您不生成异步控制器方法,这可能对您有用。

【讨论】:

  • 也适合我。谢谢!
【解决方案3】:

我也遇到了同样的问题,将上下文类更改为使用 IDbSet 使我能够成功地使用脚手架创建新控制器。但是因为我不想放弃异步方法,所以我将上下文改回使用 DbSet,这对我有用。

【讨论】:

    【解决方案4】:

    这是我解决此问题的方法。 我有 Visual Studio 2013 更新 4。
    我使用 EF 电动工具。 注释掉所有的 DbSet 在 OnModelCreating 中,只留下你正在搭建的对象: modelBuilder.Configurations.Add(new SomeTableDataMap());

    在我的上下文类的底部,我确实注意到它被创建了: 公共 System.Data.Entity.DbSet SomeTableDatas{ 得到;放; }

    哦:我也把它放在我的构造函数中,但它是为了别的, this.Configuration.LazyLoadingEnabled = false;

    说真的,这在今天有效,我已经尝试了所有这些解决方案,但对更新 4 没有任何效果。我在更新 2 和更新 3 中使用以前的解决方案。这是目前最新的解决方案。

    【讨论】:

      【解决方案5】:

      对我有用的简单解决方法(在尝试了此处建议的许多其他解决方案和其他地方徒劳无功之后......)。

      在脚手架对话框中,我刚刚添加了一个新的 DataContext,例如临时上下文。所有的脚手架都按预期工作,然后我可以简单地将 TempContext 中生成的代码移动到我的原始 DbContext 中,并将生成的控制器中的 TempContext 重命名为原始 DbContext。

      【讨论】:

        【解决方案6】:

        已针对此问题发布了多种解决方法。在此评论中,我将尝试提供可能失败的根本问题。 [希望让人们意识到根本原因]

        假设您的应用程序中有一个 DbContext(具体来说,是 DbContext 的子类),并且您正在尝试使用模型类(比如说 Model)以及 DbContext 和脚手架控制器/视图。

        我猜测 DbContext 上没有“DbSet Models {get; set;}”属性,但 DbSet 仍然使用 OnModelCreating 方法中的代码添加到 DbContext。

        在上述情况下,脚手架首先尝试检测 DbContext 上的 DbSet 属性(仅通过反射 - 因此不会检测 OnModelCreating 是否具有添加 DbSet 的代码),如果没有,脚手架将 DbSet 属性添加到 DbContext 并然后尝试使用该 DbContext 搭建脚手架,但是在运行脚手架时,我们创建了一个 DbContext 实例,并且我们还调用了 OnModelCreating ,此时,脚手架失败,因为在 DbContext 中有多个具有相同模型的 DbSet 类型(由脚手架和一个在 OnModelCreating 的代码中配置)。

        [这不仅适用于正在使用的模型,而且适用于该模型中的相关模型,脚手架为所有相关模型添加了 DbSet 属性]

        [此外,在脚手架完成后看不到添加的 DbSet,因为如果操作未成功完成,脚手架会回滚任何更改,就像 Jeff 提到的那样,错误消息最初很差,并且经过改进以提供一些提示给用户,但仍然不清楚发生了什么]

        这是脚手架中的一个错误,一个简单的解决方法是为模型类的所有相关模型使用 DbContext 上的 DbSet 属性,而不是在 OnModelCreating 中配置它们。

        【讨论】:

          【解决方案7】:

          在尝试使用 CRUD 操作和视图构建控制器时,我遇到了另一个错误。就我而言,它是在说:

          “运行选定的代码生成器时出错。对象实例 未设置为对象的实例。”

          问题很难找到:我在SQL Server 中创建了一个表,但忘记为表设置Primary Key。设置Primary key 并更新Entity Framework 的.edmx 文件解决了这个问题。

          希望对你有帮助。

          【讨论】:

          • 是您试图在代码生成器中映射的表吗?或者它可以是我模型中的任何表格吗?
          • @Zapnologica 是的...它可以是模型中的任何表格。
          【解决方案8】:

          其余的答案都不适合我。我发现这个问题只发生在使用 Fluent API 搭建和添加配置时。所以我所做的是,不是将文件分开,而是每个文件都有这样的实体配置:

          public class ApplicationUserMapConfiguration : EntityTypeConfiguration<ApplicationUserMap>
          {
              public ApplicationUserMapConfiguration()
              {
                  ToTable("ApplicationUserMap", "Users");
                  HasKey(c => c.Id);
               }
          }
          

          然后将此配置添加到 DbContext:

          protected override void OnModelCreating(DbModelBuilder modelBuilder)
          {
             modelBuilder.Configurations.Add(new ApplicationUserMapConfiguration()); 
          }
          

          我刚刚在 DbContext 中为每个实体添加了整个配置:

          protected override void OnModelCreating(DbModelBuilder modelBuilder)
              {
                  base.OnModelCreating(modelBuilder);
          
                  //ApplicationUser
          
                  modelBuilder.Entity<ApplicationUser>().HasKey(c => c.Id);
                  modelBuilder.Entity<ApplicationUser>().ToTable("ApplicationUser", "Usuario");
          
                  //Other entities...
              }
          

          现在我可以完美地搭建脚手架了。我已经提交并发出on the Mvc GitHub

          此外,如果出现另一条错误消息:

          运行所选代码生成器时出错:“调用的目标已抛出异常。”

          您应该将 DbContext 构造函数修改为:

          public YourDbContext() : base("YourDbContext", throwIfV1Schema: false) { }
          

          【讨论】:

            【解决方案9】:

            这篇文章的所有答案都不适合我。我通过添加控制器脚手架对话框中的加号按钮处理了这个问题,创建了新的上下文类。一旦 VS 创建了控制器和视图,我只需删除创建的上下文类并更改生成的控制器代码以使用我现有的上下文类。

            重要提示:此过程将为新上下文添加新的连接字符串,不要忘记将其删除。

            【讨论】:

              【解决方案10】:

              我的修复是这样的:

                  public virtual DbSet<Category> Categories { get; set; }
              
                  protected override void OnModelCreating(DbModelBuilder modelBuilder)
                  {
                      //--> EntityTypeConfiguration<Your Model Configuration>
                      modelBuilder.Configurations.Add(new EntityTypeConfiguration<CategoryMapping>());  
              
                      base.OnModelCreating(modelBuilder);
                  }
              

              不要忘记 Ctrl + Shift + B 以便您的代码编译(我不确定单个解决方案,但由于我在同一解决方案中的另一个项目中,它应该先编译)

              【讨论】:

                【解决方案11】:

                我通过在上下文类中的 OnModelCreating 函数中添加代码上的 try/catch 解决了这个问题。 只要保持 base.OnModelCreating(modelBuilder);

                在你的尝试/捕获之外

                【讨论】:

                  猜你喜欢
                  • 2014-07-17
                  • 1970-01-01
                  • 2013-11-06
                  • 1970-01-01
                  • 2013-10-05
                  • 1970-01-01
                  • 2014-08-30
                  • 1970-01-01
                  • 2013-12-30
                  相关资源
                  最近更新 更多