1

私はEFのソースコードを読んでいて、以下の方法を見つけました。メソッド名によると、dbcontext がロードされていることを確認します。これを EF Codefirst サンプルでテストすると、このメソッドは現在のアセンブリ (サンプル コンソール) を "_knownAssemblies" に追加します。

アセンブリをロードするコードが表示されません。また、アセンブリがロードされているかどうかをチェックするコードはありません。

それはネーミングの問題ですか、それとも何かを見逃していましたか? 前もって感謝します。

 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);
        }
4

1 に答える 1

0

メソッドEnsureLoadedForContextはコンテキストをロードしませんが、メソッドに渡されたコンテキスト タイプの構成をロードします。メソッドが作成された型名 ( DbConfigurationManager.EnsureLoadedForContext) でメソッドの名前を見ると、メソッドがコンテキストのロードではなく構成のロードに関連していることがより明確になります。最後に、次のようなバグの 1 つに対するコメントを見ることができます。

正しい DbConfiguration が確実に見つかるように、コンテキスト タイプが認識されるとすぐに、EnsureLoadedForContext がさまざまな場所から呼び出されます。

于 2013-06-05T03:46:04.427 に答える