我无法在Visual Studio 2013中更新控制器(带有视图的MVC5控制器,使用实体框架)(更新3和4)。错误消息如下:
运行所选代码生成器时出错:
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
我通过选择&#39;逆向工程师代码优先创建模型&#39;来自实体框架Power Tools Beta 4&#39;工具菜单。
有关可能导致此错误的内容的任何想法?
答案 0 :(得分:40)
我今天遇到了同样的问题。
我为我的一个Model类添加了一些自定义配置,以使用Fluent API添加关系。这是使用以下内容在dbContext
覆盖的OnModelCreating
类中指定的:
modelBuilder.Configurations.Add(new OrderConfiguration());
注释掉上述行允许Controller
脚手架按预期运行。
VS 2013更新2遇到了问题,脚手架出现了无用的错误,没有进一步的信息。在已安装的Update 3中,它提供了足够的详细信息来跟踪底层问题。
杰夫。
答案 1 :(得分:19)
我也遇到过这个问题。 Jeff的解决方案在某些情况下有效。但是随着我的DbContext越来越多,需要映射键的模型越来越多,我无法删除Configurations.Add()方法,因为我会得到EF无法找到主键的错误等等......
我确实发现通过将我的DBContext派生类更改为使用IDbSet属性而不是DbSet,我可以生成控制器和视图。但是,对我来说这引入了另一个问题,IDbSet不支持异步方法。
看来我可以生成具有配置的非异步控制器,也可以生成没有配置类的异步方法。
如果您的上下文属性是DbSet类型,请尝试将它们更改为IDbSet。如果您没有生成异步控制器方法,这可能对您有用。
答案 2 :(得分:6)
我也有同样的问题,改变我的上下文类使用IDbSet允许我成功使用脚手架来创建一个新的控制器。但由于我不想放弃异步方法,我将上下文改回使用DbSet,这对我有用。
答案 3 :(得分:3)
以下是我解决此问题的方法。
我有Visual Studio 2013 Update 4.
我使用的是EF Power Tools。
注释掉所有的DbSet&lt; ...&gt;
在OnModelCreating中,只保留脚手架对象:
modelBuilder.Configurations.Add(new SomeTableDataMap());
在我的上下文类的底部,我注意到它已创建: public System.Data.Entity.DbSet SomeTableDatas {get;组; }
哦:我也把它放在我的构造函数中,但它还有其他的东西, this.Configuration.LazyLoadingEnabled = false;
说真的,今天工作正常,我已经尝试了所有这些解决方案,对于Update 4没有任何作用。我使用以前的解决方案在Update 2和Update 3中工作。这是目前最新的解决方案。
答案 4 :(得分:2)
对我有用的简单解决方法(在尝试了许多其他解决方案之后,这里和其他地方都是徒劳的......)。
在脚手架对话框中,我刚刚添加了一个新的DataContext,例如TempContext。所有脚手架都按预期工作,然后我可以简单地将TempContext中生成的代码移动到我原来的DbContext中,并将生成的控制器中的TempContext重命名为原始的DbContext。
答案 5 :(得分:1)
此问题已发布多个解决方法。在这篇评论中,我将尝试提供潜在的问题,为什么这可能会失败。 [希望让人们意识到根本原因]
让我们说,你的应用程序中有一个DbContext(具体来说就是DbContext的子类),你试图使用模型类(让我们说模型)和DbContext和脚手架控制器/视图。
我猜DbContext没有&#34; DbSet&lt;型号&gt;模型{get;设置;}&#34;它上面的属性,但是使用OnModelCreating方法中的代码将DbSet添加到DbContext中。
在上面的例子中,scaffolding首先尝试检测DbContext上的DbSet属性(仅通过反射 - 这样就不会检测OnModelCreating是否有代码来添加DbSet)并且如果没有,则脚手架添加DbSet属性到DbContext,然后尝试使用该DbContext进行脚手架,但是在运行脚手架时,我们创建了一个DbContext实例,我们也调用了OnModelCreating,此时,脚手架失败,因为在DbContext中有多个具有相同模型的DbSet类型(一个由脚手架添加,另一个在OnModelCreating中的代码中配置)。
[这不仅适用于正在使用的模型,也适用于该模型中的相关模型,脚手架为所有相关模型添加了DbSet属性]
[另外,在脚手架完成之后,没有人看到添加的DbSet,因为如果操作没有成功完成,脚手架会回滚任何更改,就像Jeff提到的那样,错误信息最初很差,并且改进后给了用户一些暗示,但它还不是很清楚发生了什么事情]
这是脚手架中的一个错误,一个简单的解决方法是在DbContext上使用DbSet属性来处理模型类的所有相关模型,而不是在OnModelCreating中配置它们。
答案 6 :(得分:0)
尝试使用CRUD操作和视图来构建控制器时,我遇到了不同的错误。就我而言,它说:
&#34;运行所选代码生成器时出错。对象实例 没有设置为对象的实例。&#34;
问题很难找到:我在SQL Server
创建了一个表,但忘了为表设置Primary Key
。设置Primary key
并更新实体框架的.edmx
文件解决了这个问题。
希望它有所帮助。
答案 7 :(得分:0)
其余的答案都不适合我。我发现这个问题只发生在脚手架和使用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) { }
答案 8 :(得分:0)
这篇文章的答案都不适合我。我在Add Controller scaffolding对话框中通过加号按钮创建了新的上下文类。一旦VS创建了控制器和视图,我只需删除创建的上下文类并更改生成的控制器代码以使用我现有的上下文类。
重要:此过程将为新上下文添加新的连接字符串,不要忘记将其删除。
答案 9 :(得分:0)
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,这样你的代码就可以编译了(我不确定单个解决方案,但由于我的同一解决方案中的另一个项目,它应该先编译)
答案 10 :(得分:0)
我通过在上下文类中的OnModelCreating函数的代码上添加try / catch来解决它。 只要保持 base.OnModelCreating(模型构建器);
在你的try / catch 之外