EF Core与ASP MVC .NET 4.6

时间:2017-05-24 06:38:25

标签: asp.net-mvc-5 entity-framework-core

在一个项目中,我需要设置一个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应用程序。

任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:3)

一个简单的例子

  • Example.EF (使用EF Core和Microsoft依赖注入的.NET标准项目)。
  • Example.Tools - 引用Example.EF (仅针对开发人员运行迁移的.NET Core CommandLine项目)。
  • Example.MVC - 参考Example.EF (MVC5)。

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; s   Main上课。

您无法在此处注入连接字符串,但这不是问题,因为它仅用于创建迁移等设计时功能。