2017-03-03 13 views
5

私は学校のコード開発を始めており、私にはSchoolDbContextがあります。 Entity Frameworkの上のほとんどのドキュメントはDbContextからを導き出す提案:継承されずにDbContextを構成することはできますか?

public class SchoolDbContext : DbContext 
{ 
    public IDbSet<Student> Students => Set<Student>(); 
} 

しかし、私の引数はSchoolDbContextで、それだけではなく、そう、私の意見では、SchoolDbContextを構成する必要がありますDbContextを利用している、DbContextの専門ことはありませんDbContext:ASP.NET MVCアプリケーションの私の組成ルートで

public class SchoolDbContext 
{ 
    private readonly DbContext _dbContext; 

    public SchoolDbContext(DbContext dbContext) 
    { 
     _dbContext = dbContext; 
    } 

    public IDbSet<Student> Students => _dbContext.Set<Student>(); 
} 

、私はこの組成APPRを試してみました

private static void RegisterDependencies(Container container) 
{ 
    // Assume I have a connection string SchoolDbContext 
    container.Register(() => new DbContext("SchoolDbContext"), Lifestyle.Scoped); 
    container.Register<SchoolDbContext>(Lifestyle.Scoped); 
} 

のWeb.config:

:私は Studentsをロードしようとすると、

<connectionStrings> 
    <add name="SchoolDbContext" 
     providerName="System.Data.SqlClient" 
     connectionString="Server=(localdb)\MSSQLLocalDB;Integrated Security=true"/> 
</connectionStrings> 

これが失敗した(例として、単純なインジェクタを使用して)このように私の依存関係を設定してoach

エンティティタイプのStudentは、現在のコンテキストのモデルの一部ではありません。

私はそれを継承アプローチに戻します(つまり、デフォルトのコンストラクタnew SchoolDbContext()を呼び出す)と、すべてが完全に機能します。

私の構成法はEntity Frameworkでサポートされていませんか?

+1

あなたの意図は、アプリケーションの残りの部分からDbContextを非表示にする場合は、継承と組成の両方を行うことができます。 – Steven

+0

@Steven、trueですが、私は 'DbContext'から低レベルのデータベースAPIのほとんどを必要としないので、継承よりも合成を優先する方法があるかどうかを調べようとしています。 – rexcfnghk

答えて

5

継承される代わりにDbContextを構成できますか?公式ドキュメント(強調鉱山)

DbContextからの発言を引用するNO

は通常ルートエンティティのための DbSet<TEntity>プロパティが含まれている派生型で使用されています。短い答え

モデルの派生 クラスのインスタンスがを作成されている場合、これらの セットが自動的に初期化されている....

以上ありますが、この答えに入れても過言で。

ソースDbContext Class

は、Entity Frameworkでサポートされていない私の組成アプローチですか?

DbContextのソースコードを見ると、DbSetのクラスを検索して初期化する内部メソッドがあります。コードの

主にこのセクション

/// <summary> 
///  Initializes the internal context, discovers and initializes sets, and initializes from a model if one is provided. 
/// </summary> 
private void InitializeLazyInternalContext(IInternalConnection internalConnection, DbCompiledModel model = null) 
{ 
    DbConfigurationManager.Instance.EnsureLoadedForContext(GetType()); 

    _internalContext = new LazyInternalContext(
      this, internalConnection, model 
      , DbConfiguration.GetService<IDbModelCacheKeyFactory>() 
      , DbConfiguration.GetService<AttributeProvider>()); 
    DiscoverAndInitializeSets(); 
} 

/// <summary> 
///  Discovers DbSets and initializes them. 
/// </summary> 
private void DiscoverAndInitializeSets() 
{ 
    new DbSetDiscoveryService(this).InitializeSets(); 
} 

あなたは、モデルがそれはそれはのメンバーだった場合にのみ発生する可能性がその初期化されたコンテキストの一部ではなかったのと同じエラーがスローされます取得しようとするすべてのモデル派生クラス。

DbContext source code on Github