【问题标题】:Linq queries references different contexts but actually it is notLinq 查询引用了不同的上下文,但实际上并非如此
【发布时间】:2016-10-18 08:12:00
【问题描述】:

我正在尝试使用 EF 6 从两个不同的表中获取数据,它是一个 asp.net mvc 5 项目,其中使用了 Identity 2.0,但是当我加入两个表时,我收到两个实体的上下文的错误不同,但事实并非如此,这是我的代码:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public DbSet<UserAccountStatus> UserAccountStatuss { get; set;}

    public static ApplicationDbContext Create()
    {
       return new ApplicationDbContext();
    }
}

这是我的 linq 查询:

var result = (from user in DbContext.Users
              join accountStatus in DbContext.UserAccountStatuss on user.Id equals accountStatus.UserId
              where user.Email == email
              select accountStatus.AccountEnabled).FirstOrDefault();

我的 DbContext 属性:

public ApplicationDbContext DbContext
{
    get
    {
        return _dbContext ?? ApplicationDbContext.Create();
    }
    private set
    {
        _dbContext = value;
    }

}

确切的错误是:

指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。

这不是重复的,我见过其他问题,这些用户实际上是在尝试不同的上下文,但就我而言,我有一个。

【问题讨论】:

  • 好像你的DBContext 被实例化了两次。你能验证你的实例化逻辑是如何工作的吗?
  • @CamBruce 它已发布在问题中,

标签: c# entity-framework linq asp.net-mvc-5 asp.net-identity-2


【解决方案1】:

您的懒惰实例化是问题所在。应该是

private ApplicationDbContext _dbContext;
public ApplicationDbContext DbContext
{
    get
    {
        if(_dbContext==null){_dbContext=ApplicationDbContext.Create();}
        return _dbContext;
    }


}

编辑:懒惰示例

private Lazy<ApplicationDbContext> _dbContext=new Lazy<ApplicationDbContext>(()=>ApplicationDbContext.Create());
public ApplicationDbContext DbContext
{
    get
    {
        return _dbContext.Value;
    }


}

【讨论】:

  • 没问题。实际上,我通常喜欢将 Lazy 用于此类简单的事情,但要让它在多线程环境中正常运行是很棘手的。
【解决方案2】:

您的属性每次被访问时都会返回一个新的上下文。 您需要存储新创建的上下文,以便下次使用时可以将其返回。

【讨论】:

    【解决方案3】:
    public ApplicationDbContext DbContext
    {
        get
        {
            return _dbContext ?? ApplicationDbContext.Create();
        }
        private set
        {
            _dbContext = value;
        }
    
    }
    

    你每次都会得到一个新的上下文......

    public ApplicationDbContext DbContext
    {
        get
        {
            if(_dbContext == null)
                _dbContext = ApplicationDbContext.Create();
            return _dbContext;
        }    
    }
    

    试试这个

    【讨论】:

    • 我认为条件应该是== null
    • 我的错,我今天脑子坏了:P 感谢您指出我的错误
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2015-12-18
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多