脚手架控制器不工作与visual studio 2013更新3和4

本文关键字:更新 2013 studio visual 控制器 工作 脚手架 | 更新日期: 2023-09-27 18:15:14

我无法在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

我通过从"实体框架电动工具Beta 4"工具菜单中选择"逆向工程代码优先"创建了模型。

你知道是什么导致了这个错误吗?

脚手架控制器不工作与visual studio 2013更新3和4

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

我已经为我的一个Model类添加了一些自定义配置,以便使用fluent API添加关系。这是在OnModelCreating覆盖中的dbContext类中使用以下命令指定的:

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

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

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

杰夫。

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

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

似乎我可以生成非异步控制器配置到位或异步方法没有配置类。

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

我也有同样的问题,改变我的上下文类使用IDbSet允许我成功地使用脚手架来创建一个新的控制器。但是,由于我不想放弃异步方法,我将上下文更改回使用DbSet,这对我有用。

我是这样解决这个问题的。我有Visual Studio 2013 Update 4。
我用的是EF电动工具。注释掉所有的DbSet <…>在OnModelCreating中,只留下你是脚手架的对象:modelBuilder.Configurations。添加(新SomeTableDataMap ());

在我的上下文类的底部,我注意到这个被创建了:public System.Data.Entity.DbSet sometabledata {get;设置;}

哦:我也把这个放在我的构造函数中,但它是为了别的东西,

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

简单的解决方案,为我工作(尝试了许多其他的解决方案,在这里和其他地方无效…)。

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

已经针对这个问题发布了多个解决方案。在这篇评论中,我将尝试提供潜在的问题,为什么这可能会失败。[希望让人们意识到根本原因]

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

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

在上面的情况下,scaffolding首先尝试检测DbContext上的DbSet属性(仅通过反射-因此不检测OnModelCreating是否有添加DbSet的代码),并且给定它不是,scaffolding将DbSet属性添加到DbContext,然后尝试使用该DbContext进行脚手架,但是当运行脚手架时,我们创建DbContext的实例,我们也调用OnModelCreating,在这一点上,scaffolding失败是因为DbContext中有多个具有相同模型的DbSet类型(一个是由scaffolding添加的,另一个是在OnModelCreating中配置的)。

[这不仅发生在正在使用的模型上,也发生在该模型中的相关模型上,scaffolding为所有相关模型添加了DbSet属性]

[另外,在搭建完成后,人们不会看到添加的DbSet's,因为如果操作没有成功完成,那么搭建会回滚任何更改,就像Jeff提到的那样,错误消息最初很糟糕,并经过改进以给用户一些提示,但仍然不是很清楚发生了什么]

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

当尝试用CRUD操作和视图支撑控制器时,我得到了不同的错误。在我的例子中,它说:

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

这个问题很难发现:我在SQL Server中创建了一个表,但忘记为这个表设置Primary Key。设置Primary key和更新实体框架的.edmx文件解决了这个问题。

希望有帮助。

其余的答案都不适合我。我发现,这个问题只发生在使用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...
    }

现在我可以完美地支撑了。我已经在Mvc GitHub上提交和发布了。

同样,如果出现另一个错误消息:

运行所选代码生成器时发生错误:'调用的目标抛出了异常'

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

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

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

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

我的修改如下:

    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,所以你的代码编译(我不确定单一的解决方案,但因为我是在另一个项目在相同的解决方案,它应该先编译)

我通过添加一个尝试/捕获代码到OnModelCreating函数内的上下文类。就留着吧。base.OnModelCreating (modelBuilder);

在try/catch之外