在创建模型时不能使用上下文

在我的应用程序中,我收到以下错误:

在创建模型时不能使用上下文。

我不确定这意味着什么。 我做了一切正常,通常它的工作原理,但对于这一个,它不是。 以下是我的代码:

App.config中:

   

Products.cs:

 class Products { public int ProductID { get; set; } public string ProductName { get; set; } } 

DatabaseContext.cs:

 class DatabaseContext : DbContext { public DbSet Products { get; set; } } 

Program.cs中:

 DatabaseContext context = new DatabaseContext(); try { var products = context.Products.ToList(); foreach (var item in products) { Console.WriteLine(item.ProductID + " : " + item.ProductName); } Console.ReadLine(); } 

该行失败是var products = context.Products.ToList();

可能导致这种情况的任何想法? 我在我的数据库中设置了2个产品,因此应该输出它们。

编辑

这是我的整个App.config文件:

     

在您的连接字符串下的App.Config文件中,您有一个正斜杠(./SQLEXPRESS)。 将其更改为反斜杠。\ SQLEXPRESS如下:

  

我过去经历过这个问题,通常是因为没有使用最新版本+引用问题。

尝试从NuGet获取所有项目的最新EF版本,看看错误是否消失:
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-released.aspx

UPDATE
此错误的另一个原因可能是,当您第一次创建上下文并因此导致创建模型时,您将在单独的线程上创建另一个上下文。 在模型创建完成后,您必须等待创建其他上下文实例。

我能够通过添加来解决这个问题

 MultipleActiveResultSets=true 

到我的EF连接字符串。

我通过添加这个multithreading连接参数来修复它。

我也有这个错误但是能够通过在每个线程内部声明一个局部变量上下文而不是使用我在全局声明的那个来解决它。

  Parallel.ForEach(myList, l=> { MyContext _db = new MyContext(); // do some stuff.... _db.Model.Add(....); _db.SaveChanges(); }); 

确保您还在连接字符串中设置MultipleActiveResultSets = true,如上所述。

在我的情况下,我使用的是Code First,我忘记了为最后的更改更新数据库。上下文和数据库必须相同。 如果没有,请在包管理器中输入以下代码;

 Update-Database 

解决方案如下:

我在我的申请中遇到了同样的问题,并通过使用下面的方法解决了。

  1. validation您的模型名称和表名称,并且应该匹配。

  2. 应匹配模型中使用的数据类型和列名称以及数据库表列名称/数据类型。

  3. 在Context类中使用以下代码

     Public class MVCRepositoryContext : DbContext { static MVCRepositoryContext() { Database.SetInitializer < mvcrepositorycontext > (null); } public MVCRepositoryContext():base("MVCRepositoryContext"){ } public virtual DbSet Customers { get; set; } public virtual DbSet Books { get; set; } public virtual DbSet Authors { get; set; } } 

添加具有数据库目录名称的DatabaseContext构造函数。

 public class DatabaseContext : DbContext { public DbSet Products { get; set; } public DatabaseContext() : base("ProjectCode") {} } 

像这样在app.config中更改entityframework配置。

  

将注释添加到Products类。 确保您的数据库有一个“Products”表,其中包含两个字段“ProductId”和“ProductName”。

 class Products { [Key] public int ProductID { get; set; } public string ProductName { get; set; } } 

如果仍然出错,请尝试将项目目标框架更改为使用.net framework 4.0。

我遇到了同样的问题并使用以下代码解决了它:

 Database.SetInitializer(null); 

我有同样的问题。 我检查了我的连接字符串并确保SQL Server服务正在运行以解决此问题。

我知道这是一张旧票,但我也可以帮助另一个有同样问题的人,在我的情况下,我没有在app.config文件中的连接字符串中加载上下文:

例如

  

这应该有效。

问候。

我今天也遇到过同样的问题。
在我的情况下, 重新启动Visual Studio解决了这个问题。

代码中的一个错误是始终在using块中使用DB上下文。 DB上下文不是线程安全的。 并且每个请求最好一次使用

我也有同样的问题……但是,我的问题是我使用的是自定义角色提供程序。 此角色提供程序引用了我的上下文,该应用程序的整个生命周期仍未打开。 在多个Web浏览器尝试同时发出请求之前,这不是问题。

我的解决方案是在每个重写方法的自定义RoleProvider中创建一个新上下文,并通过using语句进行处理。

 using(var ctx = new Entities()) { //do stuff } 

因此,基本上如果您收到此错误,您需要查看堆栈跟踪并查看发生错误的方法/文件,然后修改有问题的方法/类以每次处理上下文。

在我的情况下,我使用Ninject DI并在我的自定义角色提供程序和自定义actionfilter中实现了DI。 为了解决访问相同上下文的多个线程的问题,我在这些类中废弃了DI,并且直接为每个类创建了新的上下文。

这解决了我,在创建上下文后初始化数据库

context.Database.Initialize(force:false);