LINQ查询参考不同的上下文,但实际上不是



我正在尝试使用EF 6从两个不同表中获取数据,它是一个使用Indentity 2.0的ASP.NET MVC 5项目,但是当我加入两个表时,我是获得两个实体上下文不同的错误,但是事实并非如此,这是我的代码:

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表达式包含与不同上下文关联的查询的引用。

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

您的懒惰Instantiaiton是问题所在。应该是

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

}

编辑:lazy

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

}

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

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

您每次都会得到新的上下文...

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

尝试此

最新更新