【发布时间】:2018-08-24 10:36:04
【问题描述】:
我的 DbContext 的基本实现如下;
public abstract class DataContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>, IDataContext
{
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{
}
我的实现在哪里
public class MyDataContext : DataContext, IMyDataContext
{
public MyDataContext(DbContextOptions<DataContext> options)
: base(options)
{
}
现在在运行迁移时,我使用以下(成功);
public class MyContextFactory : IDesignTimeDbContextFactory<MyDataContext>
{
public MyContextFactory()
{
}
public MyDataContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<DataContext>();
builder.UseSqlServer(DbGlobals.DevDatabase);
return new MyDataContext(builder.Options);
}
}
但是,当我尝试在 WebApi Startup.cs 中设置 DbContext 时,我添加如下;
services.AddDbContext<MyDataContext>(
options => options.UseSqlServer(DbGlobals.DevDatabase));
但是,当我运行它时,我得到以下错误;
System.InvalidOperationException:尝试激活“MyProject.Data.EF.MyDataContext”时无法解析“Microsoft.EntityFrameworkCore.DbContextOptions`1[MyProject.Data.DataContext]”类型的服务。
我认为它试图注入 DbContextOptions<MyDataContext> 而不是 DbContextOptions<DataContext>。我该如何解决它,以便它传递正确的 DbContextOptions?
或者,如果我将 MyDbContext 类构造函数调整为采用 DbContextOptions<MyDataContext>,那么如何将其转换为基本实现?
【问题讨论】:
-
您正在尝试注入一些
BemfeitoDataContext,而您上面显示的代码是带有数据上下文MyDataContext。这是拼写错误或复制/粘贴错误,还是真正的错误? -
@m3n7alsnak3 是的,这是我一直在尝试的一个错字
-
问题在于,当您尝试将
MyDataContext添加为 dbcontext 时,它会继承DataContext。您需要先注入DataContext,然后添加dbcontext -
我刚刚找到了一个基于我在这里找到的问题github.com/aspnet/EntityFrameworkCore/issues/7533 的解决方案,基本上我可以将 DbContextOptions 用于我的基本实现,然后在 MyDataContext 中使用 DbContextOptions
-
这就是我要说的——我没有在我的实现中使用工厂。只需
MyDbContext : DbContext作为一个类,然后 str8 将其注入服务中(在所有其他服务注入之后)。而类的构造函数就像public MyDbContext (DbContextOptions<MyDbContext > options) : base(options) { }
标签: c# dependency-injection asp.net-core-2.0 asp.net-core-webapi