脚手架控制器不适用于Visual Studio 2013更新3和4
我无法在Visual Studio 2013(更新3和4)中搭build一个控制器(MVC5控制器与视图,使用entity framework)。 错误消息如下:
运行选定的代码生成器时发生错误:
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”工具菜单中select“Reverse Engineer Code First”创build了模型。
任何想法可能会导致此错误?
今天我有同样的问题。
我为我的一个Model类添加了一些自定义configuration,以使用stream利的API添加关系。 这是在OnModelCreating
覆盖使用下面我的dbContext
类中指定的:
modelBuilder.Configurations.Add(new OrderConfiguration());
注释掉上面的这一行允许Controller
脚手架按预期运行。
VS 2013更新2有一个问题,脚手架没有进一步的信息提出了一个无益的错误。 在已安装的Update 3中,它提供了足够的详细信息来跟踪潜在的问题。
杰夫。
我也有这个问题。 杰夫的解决scheme在某些情况下工作。 但是,随着我的DbContext与更多的模型,有钥匙需要被映射的增长,我无法删除Configurations.Add()方法,因为我会然后得到错误,EF无法find主键,等等…
我发现通过更改我的DBContext派生类来使用IDbSet属性而不是DbSet我可以生成控制器和视图就好了。 但是,对于我这个引入了另一个问题,IDbSet不支持asynchronous方法。
看来我可以用configuration生成非asynchronous控制器,或者不用configuration类生成asynchronous方法。
如果您的上下文属性是DbSettypes,请尝试将它们更改为IDbSet。 如果您没有生成asynchronous控制器方法,这可能适用于您。
我也有同样的问题,并更改我的上下文类使用IDBSet允许我成功地使用脚手架来创build一个新的控制器。 但是因为我不想放弃asynchronous方法,我改变了上下文使用DbSet,并为我工作。
这是我如何解决这个问题。 我有Visual Studio 2013 Update 4。
我使用EF电动工具。 注释掉所有的DbSet <…>里面的OnModelCreating,只留下你脚手架的对象:modelBuilder.Configurations.Add(new SomeTableDataMap());
在我的上下文类的底部,我注意到这个被创build:public System.Data.Entity.DbSet SomeTableDatas {get; 组; }
呵呵:我也把这个放在我的构造函数中,但是这是为了别的,this.Configuration.LazyLoadingEnabled = false;
严重的是,这个工作今天,我已经尝试所有这些解决scheme什么都没有更新4的工作。我有更新2和更新3使用以前的解决scheme的工作。 这是目前最新的解决scheme。
已经为此问题发布了多个解决方法。 在这个评论中,我将尝试提供这个失败的根本问题。 [希望让人们意识到根本原因]
比方说,你的应用程序中有一个DbContext(具体来说就是DbContext的子类),并且你正在尝试使用一个模型类(比如Model)以及DbContext和脚手架控制器/视图。
我猜测DbContext没有“DbSet <Model> Models {get; set;}”属性,但DbSet仍然使用OnModelCreating方法中的代码添加到DbContext中。
在上面的情况下,脚手架首先尝试检测DbContext上的DbSet属性(仅通过reflection – 这样就不会检测OnModelCreating是否有代码添加DbSet),如果不是,则脚手架将DbSet属性添加到DbContext中,然后尝试使用DbContext脚手架,但是在运行脚手架时,我们创build了一个DbContext的实例,我们也调用了OnModelCreating,在这一点上,脚手架失败了,因为在DbContext中有多个DbSettypes和相同的模型(一个脚手架和一个在OnModelCreating中的代码中configuration)。
[这种情况不仅发生在使用的模型上,而且还发生在该模型中的相关模型上,脚手架为所有相关模型添加了DbSet属性]
[另外,在脚手架完成之后,没有看到添加的DbSet,因为如果操作没有成功完成,脚手架会回滚任何更改,就像Jeff所说的那样,错误信息最初是不好的,并且被改进以给用户一些提示但还不是很清楚发生了什么事]
这是脚手架中的一个错误,一个简单的解决方法是在DbContext上使用DbSet属性来模型类的所有相关模型,而不是在OnModelCreating中configuration它们。
简单的解决方法,为我工作(尝试了许多其他的解决scheme,build议在这里和其他地方徒劳…)。
在脚手架对话框中,我只是添加了一个新的DataContext,例如TempContext。 所有脚手架按预期工作,然后我可以简单地将生成的代码在TempContext中移动到我原来的DbContext中,并将生成的控制器中的TempContext重命名为原始的DbContext。
在尝试使用CRUD操作和视图对控制器进行脚手架时,我遇到了一个不同的错误。 就我而言,这是说:
“运行选定的代码生成器时出错,对象实例未设置为对象的实例。
问题很难find:我在SQL Server
创build了一个表,但是忘记了为表设置Primary Key
。 设置Primary key
和更新entity framework的.edmx
文件解决了这个问题。
希望能帮助到你。
其余的答案没有为我工作。 我发现这个问题只发生在使用Fluent API脚手架和添加configuration的时候。 所以我所做的是,而不是分离文件,每个人都有一个像这样的实体configuration:
public class ApplicationUserMapConfiguration : EntityTypeConfiguration<ApplicationUserMap> { public ApplicationUserMapConfiguration() { ToTable("ApplicationUserMap", "Users"); HasKey(c => c.Id); } }
然后将此configuration添加到DbContext中:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new ApplicationUserMapConfiguration()); }
我只是在每个实体的DbContext中添加了整个configuration:
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上发布 。
另外,如果另外一个错误信息提出:
运行选定的代码生成器时发生错误:“exception已被调用的目标引发”。
您应该修改您的DbContext构造函数为:
public YourDbContext() : base("YourDbContext", throwIfV1Schema: false) { }
这篇文章的答案没有为我工作。 我通过添加控制器脚手架对话框中的加号button来处理这个问题,创build新的上下文类。 一旦VS创build控制器和视图,我只是删除创build的上下文类,并更改生成的控制器代码使用我现有的上下文类。
重要提示 :这个过程会为新的上下文添加一个新的连接string,不要忘了删除它。
我得到这样的修正:
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让你的代码编译(我不确定单一的解决scheme,但由于我在同一解决scheme中的另一个项目,它应该首先编译)
我通过在代码上添加一个try / catch来解决这个问题,在上下文类中的OnModelCreating函数。 只要保持base.OnModelCreating(modelBuilder);
在你的try / catch之外