【问题标题】:Microsoft.EntityFrameworkCore.Tools - Azure Functions with .NET 5 (Isolated) Design-time DbContext Creation with HostBuilderMicrosoft.EntityFrameworkCore.Tools - 使用 .NET 5(隔离)设计时使用 HostBuilder 创建 DbContext 的 Azure Functions
【发布时间】:2021-08-22 08:17:36
【问题描述】:

我使用模板Azure Functions.NET 5 (Isolated)Http triggerVisual Studio Version 16.10.0 中创建了一个新的FunctionApp

然后我创建了以下文件:

博客.cs

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

ApplicationDbContext.cs

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(
        DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }

    public DbSet<Blog> Blogs { get; set; }
}

程序.cs

public class Program
{
    public static void Main()
    {
        var host = new HostBuilder()
            .ConfigureFunctionsWorkerDefaults()
            .ConfigureServices(services =>
            {
                var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings:DefaultConnection");
                services.AddDbContext<ApplicationDbContext>(options =>
                        options.UseSqlServer(
                        connectionString,
                        sqlServerOptions => sqlServerOptions.CommandTimeout(600)));
            })
            .Build();

        host.Run();
    }
}

函数1.cs

public class Function1
{
    private readonly ApplicationDbContext _applicationDbContext;

    public Function1(ApplicationDbContext applicationDbContext)
    {
        _applicationDbContext = applicationDbContext;
    }

    [Function("Function1")]
    public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req,
        FunctionContext executionContext)
    {
        var logger = executionContext.GetLogger("Function1");
        logger.LogInformation("C# HTTP trigger function processed a request.");

        var connectionString = _applicationDbContext.Database.GetDbConnection().ConnectionString;

        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "text/plain; charset=utf-8");

        response.WriteString("Welcome to Azure Functions!");

        return response;
    }
}

local.settings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=FunctionApp1.Test;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
  }
}

host.json

{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            }
        }
    }
}

我已经验证依赖注入可以从Program.cs -> new HostBuilder

如果我在包管理器控制台中运行Add-Migration InitialCreate,我会收到以下错误:

无法创建“ApplicationDbContext”类型的对象。为了 设计时支持的不同模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=vs

https://docs.microsoft.com/en-us/ef/core/cli/dbcontext-creation?tabs=vs

要从应用程序的服务提供者获取 DbContext 对象,示例代码如下所示:

public class Program
{
    public static void Main(string[] args)
        => CreateHostBuilder(args).Build().Run();

    // EF Core uses this method at design time to access the DbContext
    public static IHostBuilder CreateHostBuilder(string[] args)
        => Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(
                webBuilder => webBuilder.UseStartup<Startup>());
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

工具首先尝试通过调用获取服务提供者 Program.CreateHostBuilder(),调用 Build(),然后访问 服务属性。

有没有办法让工具与 HostBuilder 一起工作?

【问题讨论】:

    标签: c# .net azure entity-framework .net-core


    【解决方案1】:

    【讨论】:

    • 当然可以,但是在不同环境之间传递连接字符串变得更加困难。如果有办法与HostBuilder 集成,我会更喜欢它。下面的解决方案适用于控制台应用程序和类似但不是使用环境变量的 Azure 函数。 stackoverflow.com/a/52418717/3850405
    【解决方案2】:

    这几天我遇到了类似的问题。我刚刚看了你的解决方案,它对我帮助很大。但是我没有创建 StartUp 类来添加数据库上下文

    public static IHostBuilder CreateHostBuilder(string[] args)
            => new HostBuilder()
            .ConfigureFunctionsWorkerDefaults()
            .ConfigureServices(service => ConfigureServices(service));
    

    ConfigureServices 里面我只有:

    services.AddDbContext<ApplicationDbContext>();
    

    它有效。

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2021-04-20
      • 2021-07-06
      • 2021-10-04
      • 2022-06-28
      • 1970-01-01
      相关资源
      最近更新 更多