假設我正在爲一所學校開發一個代碼優先的開發項目,並且我有一個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()
)時,一切正常。
我的構圖方法不被實體框架支持嗎?
如果你的目的是從應用程序的其餘部分隱藏的DbContext,可以做到既繼承和組合。 – Steven
@Steven,這是真的,但我只是試圖看看是否有更好的方法來選擇繼承,因爲我不需要'DbContext'中的大部分低級數據庫API。 – rexcfnghk