2013-06-04 3 views
1

Я читаю исходный код EF и нашел этот метод ниже. В соответствии с именем метода, убедитесь, что загружен dbcontext. Когда я тестирую это с помощью примера EF Codefirst, этот метод добавляет текущую сборку (мою тестовую консоль) к «_knownAssemblies».EF: Метод EnsureLoadedForContext

Я не вижу никакого кода загрузки сборки. И я не вижу никакого кода, который проверяет, загружена ли сборка или нет.

Это проблема с именами или я что-то пропустил? Заранее спасибо.

public virtual void EnsureLoadedForContext(Type contextType) 
     { 
      DebugCheck.NotNull(contextType); 
      Debug.Assert(typeof(DbContext).IsAssignableFrom(contextType)); 

      var contextAssembly = contextType.Assembly; 

      if (contextType == typeof(DbContext) 
       || _knownAssemblies.ContainsKey(contextAssembly)) 
      { 
       return; 
      } 

      if (_configurationOverrides.IsValueCreated) 
      { 
       lock (_lock) 
       { 
        if (_configurationOverrides.Value.Count != 0) 
        { 
         return; 
        } 
       } 
      } 

      if (!ConfigurationSet) 
      { 
       var foundConfigurationType = 
        _loader.TryLoadFromConfig(AppConfig.DefaultInstance) ?? 
        _finder.TryFindConfigurationType(contextType); 

       if (foundConfigurationType != null) 
       { 
        SetConfigurationType(foundConfigurationType); 
       } 
      } 
      else if (!contextAssembly.IsDynamic // Don't throw for proxy contexts created in dynamic assemblies 
        && !_loader.AppConfigContainsDbConfigurationType(AppConfig.DefaultInstance)) 
      { 
       var foundType = _finder.TryFindConfigurationType(contextType); 
       if (foundType != null) 
       { 
        if (_configuration.Value.Owner.GetType() == typeof(DbConfiguration)) 
        { 
         throw new InvalidOperationException(Strings.ConfigurationNotDiscovered(foundType.Name)); 
        } 
        if (foundType != _configuration.Value.Owner.GetType()) 
        { 
         throw new InvalidOperationException(
          Strings.SetConfigurationNotDiscovered(_configuration.Value.Owner.GetType().Name, contextType.Name)); 
        } 
       } 
      } 

      _knownAssemblies.TryAdd(contextAssembly, null); 
     } 

ответ

0

Метод EnsureLoadedForContext не загружает контекст, но загружает конфигурацию для типа контекста, переданный методу. Когда вы смотрите на имя метода с именем типа, на котором создается метод (DbConfigurationManager.EnsureLoadedForContext), гораздо более ясно, что этот метод связан с загрузкой конфигурации, а не с загрузкой контекста. Наконец, вы можете посмотреть на комментарии к одному из bugs, который гласит:

EnsureLoadedForContext вызывается из разных мест, как только тип контекста известно для того, чтобы правильно DBConfiguration найден.

+0

Да. "DbConfigurationManager.EnsureLoadedForContext)" имеет больше смысла для меня сейчас .. Спасибо –

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