Tim*_*ong 0 c# ef-code-first entity-framework-core asp.net-core
我刚刚开始使用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());
}
Run Code Online (Sandbox Code Playgroud)
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(); }
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行Web应用程序时,我能够注册一个用户帐户并登录,EF创建数据库,创建Identity表并用用户数据填充它们.还创建了products表 - 因此在某种程度上,EF能够使用ApplicationDbContext并找到它用于创建数据库和模式的提供程序.
但是,当我尝试访问我的产品控制器时,它使用了ProductsRepositoryEF抱怨 - 尽管ApplicationDbContext在两种情况下都使用并且用于创建数据库!
那怎么来的?ASP.net Identity有什么特别的,它可以某种方式获得提供者,但我自己的代码不能?我错过了什么"神奇的咒语"?
它是因为你正在新建它,而不是为它注入它.您正在新建的那个尚未配置.您应该更改您的类以将其传递给构造函数.
DbContext有多个构造函数,你使用的是没有配置它的空元素.
最好通过制作这样的构造函数来注入它:
public ApplicationUnitOfWork(ApplicationDbContext context)
{
dbContext = context;
Products = new ProductRepository(dbContext);
}
Run Code Online (Sandbox Code Playgroud)
你的代码显示ApplicationDbContext已经注册了DI,Identity正在使用注入的那个,但你不是因为你自己用无参数构造函数创建了它
您还应注册ApplicationUnitOfWork,以便注入:
services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
971 次 |
| 最近记录: |