2017-03-03 41 views
5

假設我正在爲一所學校開發一個代碼優先的開發項目,並且我有一個SchoolDbContext。在實體框架絕大多數文檔建議你獲得DbContext可以將DbContext組合而不是繼承?

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

但我的觀點是SchoolDbContext是從來沒有的DbContext專業化,它不是僅僅利用的DbContext所以在我看來,SchoolDbContext應該組成DbContext

public class SchoolDbContext 
{ 
    private readonly DbContext _dbContext; 

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

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

在ASP.NET MVC應用程序的我的作文根,我想這組成APPR oach通過設置我的依賴就像這樣(使用簡單注射器爲例):

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文件:

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

這時候我嘗試加載Students與失敗

實體類型Student不是當前上下文模型的一部分。

當我將其更改回繼承方法(即調用默認構造函數new SchoolDbContext())時,一切正常。

我的構圖方法不被實體框架支持嗎?

+1

如果你的目的是從應用程序的其餘部分隱藏的DbContext,可以做到既繼承和組合。 – Steven

+0

@Steven,這是真的,但我只是試圖看看是否有更好的方法來選擇繼承,因爲我不需要'DbContext'中的大部分低級數據庫API。 – rexcfnghk

回答

5

可以組成DbContext而不是繼承?

簡短的回答:NO

引述官方文檔的言論(重點煤礦)

DbContext通常與包含根實體 DbSet<TEntity>性質派生類型使用的模型。

還有更多的卻是太多,把這個答案是創建派生 類的實例時,這些 集自動初始化......。

來源DbContext Class

是我的組合方法不受實體框架的支持?

如果你看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