在一个项目中,我需要设置一个ASP.NET MVC(使用.NET 4.6.1),但使用" new" EF Core用于访问数据库。
不幸的是,每个文档都只解释了如何设置ASP.NET Core MVC项目。
我刚试了一下,当涉及通过Package Manager Console创建数据库时,我收到错误消息:
在' DataContext'上找不到无参数构造函数。要么添加一个 无参数构造函数到' DataContext'或者添加一个实现 ' IDbContextFactory'在与DataContext'
相同的程序集中
是的,我没有无参数构造函数,但微软的示例代码也没有
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
我想问题是,我没有在Startup.cs中注册DataContext,而我没有在#34; old&#34; ASP.NET MVC应用程序。
任何人都可以帮我这个吗?
答案 0 :(得分:3)
一个简单的例子
在 Example.EF 中:安装EF Core,Microsft Dependency Injection。创建一个类来支持DI
public static class IocConfiguration
{
public static void Configure()
{
var services = new ServiceCollection();
services.AddDbContextPool<ExampleContext>(options => {
options.UseSqlServer("_connectionstring_");
});
// Register to support the ExampleController can get DbContext.
services.AddTransient(typeof(ExampleController));
var serviceProvider = services.BuildServiceProvider();
DependencyResolver.SetResolver(new DefaultServiceResolver(serviceProvider));
}
}
public class DefaultServiceResolver : IDependencyResolver
{
private readonly IServiceProvider _serviceProvider;
public DefaultServiceResolver(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public object GetService(Type serviceType)
{
return _serviceProvider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _serviceProvider.GetServices(serviceType);
}
}
在 Example.MVC 中,使用Global.asax中的Application_Start或使用Owin启动
// Register services.
IocConfiguration.Configure();
// Example controller
public class ExampleController : Controller
{
private readonly ExampleContext _exampleContext;
public ExampleController(ExampleContext exampleContext)
{
_exampleContext = exampleContext;
}
}
要运行迁移:
Add-Migration {MigrationName} -Project Example.EF -StartupProject Example.Tools
我们应该有IDesignTimeDbContextFactory来支持运行迁移。
答案 1 :(得分:1)
根据https://docs.microsoft.com/en-gb/ef/core/miscellaneous/cli/dbcontext-creation,您需要创建一个工厂。
来自设计时工厂
您还可以通过实现
IDesignTimeDbContextFactory<TContext>
接口告诉工具如何创建DbContext:如果在与派生DbContext
相同的项目中或在应用程序中找到实现此接口的类&# 39; s启动项目,这些工具绕过创建DbContext的其他方式,而是使用设计时工厂。 C#using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; namespace MyProject { public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext> { public BloggingContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); optionsBuilder.UseSqlite("Data Source=blog.db"); return new BloggingContext(optionsBuilder.Options); } } }
注意 args参数当前未使用。有an issue跟踪从工具中指定设计时参数的功能。
如果您需要为设计时而不是在运行时配置DbContext,如果
DbContext
构造函数在DI中未注册其他参数,则设计时工厂尤其有用,如果您不使用完全是DI,或者如果由于某种原因你不想在ASP.NET核心应用程序中使用BuildWebHost
方法&#39; sMain
上课。
您无法在此处注入连接字符串,但这不是问题,因为它仅用于创建迁移等设计时功能。