c# - 创建模型时无法使用上下文。但是我只有一个 dbcontext?

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

我有一个使用 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/

相关文章:

c# - 尝试为 api 创建等效于 C# 签名哈希方法的 php

c# - JavaScriptCompressor、CssCompressor 和多线程

c# - 当前对 Controller 类型 'Create' 的操作 'WeeklyTargetController' 的请求在以下操作方法 : 之间不明确

c# - 如何在 C# 中的 foreach 之后返回列表以查看

c# - 实体到 WCF 数据协定

C# 从另一个方法调用事件 (linkLabel2_LinkClicked)

javascript - 在后面的 C# 代码中添加鼠标悬停属性

asp.net-mvc - MVC验证属性

c# - 使用 Foq 模拟具有显式实现接口(interface)的类

c# - System.NotSupportedException : 'The LINQ expression node type ' Invoke' is not supported in LINQ to Entities. '