我有一个使用 EF 的 ASP.net MVC 项目。我创建实体也是存储库部分。在我的本地主机上,一切都很好并且可以正常工作。但是当我将这个项目删除到 webhost 时,我猜是出了什么问题。
“创建模型时无法使用上下文。如果在OnModelCreating方法内部使用上下文,或者多个线程同时接受同一个上下文实例,则可能会抛出此异常。注意DbContext的实例成员和不保证相关类是线程安全的。”
不是每次都这样,但有时我在尝试连接我的网站时会遇到此错误。
这是我的 Repository.cs
public class Repository<T> : IDataAccess<T> where T : class
{
private DatabaseContext context;
private DbSet<T> _objectSet;
public Repository()
{
context = RepositoryBase.CreateContext();
_objectSet = context.Set<T>();
}
public List<T> List()
{
return _objectSet.ToList();
}
public IQueryable<T> ListQueryable()
{
return _objectSet.AsQueryable<T>();
}
public List<T> List(Expression<Func<T, bool>> where)
{
return _objectSet.Where(where).ToList();
}
}
这是我的 RepositoryBase.cs
public class RepositoryBase
{
private static DatabaseContext context;
private static object _lockSync = new object();
protected RepositoryBase()
{
}
public static DatabaseContext CreateContext()
{
if (context == null)
{
lock (_lockSync)
{
if (context == null)
{
context = new DatabaseContext();
}
}
}
return context;
}
}
和我的数据库上下文:
public class DatabaseContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Soru> Sorular { get; set; }
public DbSet<Comment> Comments { get; set; }
public DbSet<Kategori> Kategoriler { get; set; }
public DbSet<Tahmin> Tahminler { get; set; }
public DbSet<Oneri> Oneriler { get; set; }
public DatabaseContext()
{
Database.SetInitializer(new MyInitializer());
}
}
我研究了这个问题,但不幸的是,我无法解决它。我不明白我做错了什么。
最佳答案
您的 DatabaseContext
实例在 RepositoryBase
类中声明为 static
。
private static DatabaseContext context;
因此,所有并发请求共享同一个实例,
导致不同线程对 DbContext
进行多个同时操作,
这是不支持的。
修改你的代码,让每个请求都有自己的实例
例如,通过删除 static 关键字。
如果每个请求都有自己的实例,则不再需要应用锁。
还要确保在不再需要 DbContex
时调用 Dispose
方法,例如。在网络请求的末尾。
关于c# - 创建模型时无法使用上下文。但是我只有一个 dbcontext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51397788/