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

时间:2012-03-17 12:49:16

标签: c# entity-framework

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

  

创建模型时无法使用上下文。

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

App.config中:

 <connectionStrings>
    <add name="DatabaseContext" connectionString="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
 </connectionStrings>

Products.cs:

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

DatabaseContext.cs:

class DatabaseContext : DbContext
{
    public DbSet<Products> 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文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <connectionStrings>
    <add name="DatabaseContext" connectionString="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

14 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:15)

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

<add name="DatabaseContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />

答案 2 :(得分:10)

我可以通过添加

解决此问题
MultipleActiveResultSets=true

到我的EF连接字符串。

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

答案 3 :(得分:2)

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

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

    });

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

答案 4 :(得分:1)

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

Update-Database

答案 5 :(得分:1)

解决以下问题:

我的申请中遇到了同样的问题,并通过使用以下内容解决了这个问题。

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

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

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

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

答案 6 :(得分:0)

使用数据库目录名称添加DatabaseContext构造函数。

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

    public DatabaseContext() : base("ProjectCode") {}
}

在app.config中更改entityframework配置,如下所示。

<parameter value="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;MultipleActiveResultSets=true" />

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

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

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

答案 7 :(得分:0)

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

Database.SetInitializer<EntitiesName>(null);

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

e.g。

<add name="SalesContext" connectionString="" providerName="System.Data.SqlClient" />

这应该有效。

问候。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

我也遇到了同样的问题...但是,我的问题是我正在使用自定义角色提供程序。该角色提供者参考了我的上下文,该上下文在应用程序的整个生命周期中都保持打开状态。在多个Web浏览器尝试同时发出请求之前,这不是问题。

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

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

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

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

答案 13 :(得分:0)

1-确保连接字符串具有反斜杠而不是正斜杠:

connectionString="Data Source=.\SQLEXPRESS ....

2-将MultipleActiveResultSets=true添加到连接字符串。

3-对我来说,是造成我的DbContext类有多个构造函数的原因:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace MyProject
{
    public partial class Model1 : DbContext
    {
        // I had to comment out this one ...
        //public Model1()
        //    : base("name=Model1")
        //{
        //}

        public Model1(bool enableLazyLoading = true)
            : base("name=Model1")
        {
            //Database.SetInitializer<Model1>(new CreateDatabaseIfNotExists<Model1>());            
            //this.Configuration.LazyLoadingEnabled = false;

            Database.SetInitializer<Model1>(null);
            this.Configuration.ProxyCreationEnabled = false;

            ((IObjectContextAdapter)this).ObjectContext.ContextOptions.LazyLoadingEnabled = enableLazyLoading;          
            ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled = enableLazyLoading;
        }

        public virtual DbSet<Product> Products { get; set; }
        // ...
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // ...
        }
    }
}

一旦我注释掉了原来的Model1构造函数,它便解决了它。

我留下了两个版本的“延迟加载/ Database.SetInitializer”以显示有两种方法可以启用或禁用。

  • 如果您使用前两行不使用它,请不要使用后四行并删除bool enableLazyLoading = true
  • 如果您确实使用了如图所示的4行,请确保注释掉这两行并保留bool enableLazyLoading = true