2016-06-16 10 views
0

Я пытаюсь получить данные из двух разных таблиц, используя EF 6, это проект asp.net mvc 5 с использованием Identity 2.0, однако, когда я присоединяюсь к двум таблицам, я получаю сообщение об ошибке, что контексты обоих образований различны, однако это не так, вот мой код:Запросы Linq ссылаются на разные контексты, но на самом деле это не

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 содержит ссылки на запросы, которые связаны с различными контекстами.

и это не является дубликат, я видел другие вопросы, в том пользователе на самом деле пытаемся разные контексты, но в моем случае я один.

+0

Кажется, что ваш 'DBContext' получает экземпляр дважды. Можете ли вы проверить, как работает ваша логика создания экземпляров? –

+0

@CamBruce опубликовано в вопросе –

ответ

6

ваша проблема с ленивым instantiaiton. Он должен быть

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


} 

Edit: Пример с Лазы

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


} 
+0

спасибо, это была глупая ошибка :( –

+0

Нет проблем. Мне обычно нравится использовать Lazy для простых вещей вроде этого, но заставить его правильно работать в многопоточных средах сложно .?. – Benjamin

+0

вы можете показать пример с Лазы

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

} 

Вы получаете новый контекст каждый раз, когда ...

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

Попробуйте

+2

Я думаю, что условие должно быть '== null' – Shaharyar

+0

мой плохое, мой ум из ума сегодня: P спасибо за указание своей ошибки –

+0

права ... обновленный –

1

Вашей недвижимости будет возвращать новый контекст каждый раз, когда он будет доступен. Вам нужно сохранить вновь созданный контекст, чтобы он мог быть возвращен при следующем использовании.

 Смежные вопросы

  • Нет связанных вопросов^_^