创建模型时不能使用上下文。但是我只有一个dbcontext?

时间:2018-07-18 09:00:42

标签: c# asp.net-mvc entity-framework model dbcontext

我有一个使用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());
    }
}

我研究了这个问题,但不幸的是,我无法解决它。我不明白我在做什么错。

1 个答案:

答案 0 :(得分:1)

您的DatabaseContext实例在static类中被声明为RepositoryBase

private static DatabaseContext context;

因此,所有并发请求共享同一实例, 导致DbContext上来自不同线程的多个同时操作, 不支持。

重新编写代码,以便每个请求都有自己的实例 例如,通过删除static关键字。
如果每个请求都有其自己的实例,则不再需要应用锁定。

还请确保在不再需要Dispose时调用DbContex方法,例如。在Web请求结束时。