我有一个使用EF的ASP.net MVC项目。我还创建了实体存储库部分。在我的本地主机中,一切都很好,并且可以正常工作。但是,当我将此项目移至虚拟主机后,我想可能出了点问题。
“创建模型时不能使用上下文。如果在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;
}
}
和我的DatabaseContext:
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());
}
}
我研究了这个问题,但不幸的是,我无法解决它。我不明白我在做什么错。
答案 0 :(得分:1)
您的DatabaseContext
实例在static
类中被声明为RepositoryBase
。
private static DatabaseContext context;
因此,所有并发请求共享同一实例,
导致DbContext
上来自不同线程的多个同时操作,
不支持。
重新编写代码,以便每个请求都有自己的实例
例如,通过删除static关键字。
如果每个请求都有其自己的实例,则不再需要应用锁定。
还请确保在不再需要Dispose
时调用DbContex
方法,例如。在Web请求结束时。