创建模型时不能使用该上下文
本文关键字:上下文 不能 模型 创建 | 更新日期: 2023-09-27 18:28:10
在我的应用程序中,我收到以下错误:
创建模型时不能使用该上下文。
我不确定这意味着什么。我已经像往常一样做了所有事情,通常它有效,但对于这个来说并非如此。下面是我的代码:
应用配置:
<connectionStrings>
<add name="DatabaseContext" connectionString="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
产品.cs:
class Products
{
public int ProductID { get; set; }
public string ProductName { get; set; }
}
DatabaseContext.cs:
class DatabaseContext : DbContext
{
public DbSet<Products> Products { get; set; }
}
课程.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 个产品,所以它应该输出它们。
编辑
这是我的整个应用程序配置文件:
<?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>
在连接字符串下的 App.Config 文件中,有一个正斜杠 (./SQLEXPRESS(。将其更改为反斜杠 .''SQLEXPRESS,如下所示:
<add name="DatabaseContext" connectionString="Data Source=.'SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
我过去遇到过这个问题,通常是由于没有使用最新版本+引用问题。
尝试从 NuGet 获取所有项目的最新 EF 版本,看看错误是否消失:
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-released.aspx
更新
此错误的另一个原因可能是,当您第一次创建上下文并因此导致创建模型时,您会在单独的线程上创建另一个上下文。在模型创建完成后,您必须等待其他上下文实例创建。
我能够通过添加来解决此问题
MultipleActiveResultSets=true
到我的 EF 连接字符串。
我通过添加这个多线程连接参数来修复它。
我也遇到了这个错误,但能够通过在每个线程内声明一个局部变量上下文而不是使用我全局声明的上下文来解决它。
Parallel.ForEach(myList, l=>
{
MyContext _db = new MyContext();
// do some stuff....
_db.Model.Add(....);
_db.SaveChanges();
});
请确保在连接字符串中还设置 MultipleActiveResultSets=true,如上所述。
就我而言,我使用的是 Code First,我忘记为最后的更改更新数据库。上下文和数据库必须相同。如果没有,请在包管理器中输入以下代码;
Update-Database
由以下方法解决:
我在应用程序中遇到了同样的问题,并使用以下方法解决了。
-
验证模型名称和表名称,它应该匹配。
-
模型中使用的数据类型和列名与数据库表列名/数据类型应匹配。
-
在上下文类中使用以下代码
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; } }
我今天也遇到了同样的问题。
在我的情况下,重新启动Visual Studio解决了这个问题。
添加具有数据库目录名称的 DatabaseContext 构造函数。
public class DatabaseContext : DbContext {
public DbSet<Products> Products { get; set; }
public DatabaseContext() : base("ProjectCode") {}
}
像这样更改 app.config 中的实体框架配置。
<parameter value="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;MultipleActiveResultSets=true" />
向产品类添加批注。 确保您的数据库有一个"产品"表,其中包含拖曳字段"ProductId"和"ProductName"。
class Products {
[Key]
public int ProductID { get; set; }
public string ProductName { get; set; }
}
如果仍然错误,请尝试将项目目标框架更改为使用 .net Framework 4.0。
我遇到了同样的问题,并使用以下代码解决了它:
Database.SetInitializer<EntitiesName>(null);
我遇到了同样的问题。我检查了我的连接字符串,并确保 SQL Server 服务正在运行以解决此问题。
这是一张旧票,但我也可以帮助另一个有同样问题的人,就我而言,我没有在 app.config 文件中的连接字符串中加载上下文:
例如
<add name="SalesContext" connectionString="" providerName="System.Data.SqlClient" />
这应该有效。
问候。
代码中的一个错误是始终在块中使用数据库上下文using
。数据库上下文不是线程安全的。并且最好每个请求使用一个即时<</p>
我也有同样的问题......但是,我的问题是我使用的是自定义角色提供程序。 此角色提供程序引用了我的上下文,该上下文在应用程序的整个生命周期内保持打开状态。 在多个 Web 浏览器尝试同时发出请求之前,这不是问题。
我的解决方案是在每个重写方法的自定义 RoleProvider 中创建一个新上下文,并通过 using 语句进行释放。
using(var ctx = new Entities())
{
//do stuff
}
因此,基本上,如果您收到此错误,则需要查看堆栈跟踪并查看错误发生在哪个方法/文件上,然后修改有问题的方法/类以每次处理上下文。
就我而言,我使用 Ninject DI,并在自定义角色提供程序和自定义操作筛选器中实现了 DI。为了解决多个线程访问同一上下文的问题,我废弃了这些类中的 DI,并直接为每个类创建一个新上下文。
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
构造函数,它就解决了它。
我留下了 2 个版本的延迟加载/Database.SetInitializer
,以显示有 2 种方法可以做到这一点 - 启用或禁用。
- 如果您使用前 2 行不使用它,请不要使用后 4 行并删除
bool enableLazyLoading = true
. - 如果您确实使用如图所示的 4 行,请确保将这 2 行注释掉并保持
bool enableLazyLoading = true
。