[英]Why does EF7 say I haven't configured any providers, when ASP.net Identity is working fine with the same DbContext?
我剛剛開始使用ASP.net 5,MVC6和Entity Framework 7進行實驗項目。我的ASP.Net Identity工作正常,但隨后嘗試將自己的一些數據添加到DbContext中並解決了這個問題。 EF7報告:
處理請求時發生未處理的異常。
InvalidOperationException:沒有配置數據庫提供程序。 在設置服務時,通過覆蓋DbContext類或AddDbContext方法中的OnConfiguring來配置數據庫提供程序。
Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)堆棧查詢Cookie頭
InvalidOperationException:沒有配置數據庫提供程序。 在設置服務時,通過覆蓋DbContext類或AddDbContext方法中的OnConfiguring來配置數據庫提供程序。
這是我的配置方法:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
services.AddTransient<ApplicationUnitOfWork>(instance => new ApplicationUnitOfWork());
}
ApplicationUnitOfWork
是EF7的立面,以減少緊密耦合。 到目前為止,這是整個過程:
public class ApplicationUnitOfWork : IUnitOfWork
{
readonly ApplicationDbContext dbContext;
public ApplicationUnitOfWork()
{
dbContext = new ApplicationDbContext();
Products = new ProductRepository(dbContext);
}
public void Dispose() { dbContext.Dispose(); }
public IUserRepository Users { get; }
public IRepository<SoftwareProduct> Products { get; }
public async Task CommitAsync() { await dbContext.SaveChangesAsync(); }
public void Cancel() { throw new NotImplementedException(); }
}
現在,當我運行Web應用程序時,我可以注冊一個用戶帳戶並登錄,EF可以創建數據庫,創建Identity表並使用用戶數據填充它們。 產品表也已創建-顯然,在某種程度上,EF能夠使用ApplicationDbContext
並找到用於創建數據庫和架構的提供程序。
然而,當我嘗試訪問我的產品控制器,它使用ProductsRepository
,EF抱怨-即使ApplicationDbContext
在這兩種情況下使用,用於創建數據庫!
那怎么會 ASP.net Identity有什么特別之處,它可以某種方式獲得提供程序,但是我自己的代碼不能? 我缺少什么“魔咒”?
這是因為您正在更新它,而不是為您注入了它。 您要更新的一個尚未配置。 您應該更改您的類以使其傳遞到構造函數中。
DbContext具有多個構造函數,並且您正在使用未配置的空構造函數。
最好讓您的構造函數像這樣注入它:
public ApplicationUnitOfWork(ApplicationDbContext context)
{
dbContext = context;
Products = new ProductRepository(dbContext);
}
您的代碼顯示ApplicationDbContext已在DI中注冊,Identity正在使用注入的DI,但自從您使用無參數構造函數對它進行了自定義以來,您就沒有這樣做了。
您還應該注冊您的ApplicationUnitOfWork以便可以注入它:
services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.