使用 DBContext 将 SQL Server 数据库与时间触发的 Azure 函数连接起来
Posted
技术标签:
【中文标题】使用 DBContext 将 SQL Server 数据库与时间触发的 Azure 函数连接起来【英文标题】:Connecting SQL Server database with time-triggered Azure Function using DBContext 【发布时间】:2021-08-12 19:41:19 【问题描述】:我对 Azure Functions 非常陌生,在将它与 SQL Server 数据库连接时遇到了问题。我正在使用 DbContext 来执行此操作。
这是我的代码:
DbContext (EntityContext.cs
):
public EntityContext(DbContextOptions<EntityContext> options) : base(options)
public DbSet<User> Users get; set;
public class User
public long UserId get; set;
public DateTime CreatedOn get; set;
public long CreatedBy get; set;
public DateTime ModifiedOn get; set;
public long ModifiedBy get; set;
public string EmailId get; set;
public long PhoneNumber get; set;
IUserRepository.cs
:
public interface IUserRepository
IEnumerable<User> GetUsersData();
User UpdateUser(User userList);
UserRepository.cs
:
public class UserRepository: IUserRepository
private readonly EntityContext context;
public UserRepository(EntityContext context)
this.context = context;
public IEnumerable<User> GetUsersData()
var s = context.Users.Where(x => x.UserId == 123).ToList();
return s;
public User UpdateUser(User userList)
var users = context.Users.Attach(userList);
users.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
context.SaveChanges();
return userList;
Startup.cs
:
public class Startup
private IConfiguration Configuration;
public Startup(IConfiguration configuration)
Configuration = configuration;
public void ConfigureServices(IServiceCollection services)
services.AddDbContext<EntityContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<IUserRepository, UserRepository>();
local.settings.json
:
"IsEncrypted": false,
"Values":
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet"
,
"ConnectionStrings":
"DefaultConnection": "Server= ;Initial Catalog=;User ID=;Password= ;MultipleActiveResultSets= True;Persist Security Info=True;"
Function1.cs
:
private readonly IUserRepository _irepo;
public Function1(IUserRepository irepo)
_irepo = irepo;
[FunctionName("Function1")]
public void Run([TimerTrigger("0 15 18 * * *")]TimerInfo myTimer, ILogger log)
// I have set the cron expression to 6.15 pm for the testing purpose only
_irepo.GetUsersData();
log.LogInformation($"C# Timer trigger function executed at: DateTime.Now");
这是我正在使用的软件包列表:
Packages
我也咨询过this,但对我没有帮助。
我也遇到了错误
Microsoft.Extensions.DependencyInjection.Abstractions:尝试激活“MyProject.Function1”时无法解析“MyProject.Models.Repository.IUserRepository”类型的服务。
在某处我还学会了使用包管理器控制台来添加迁移,但我不确定它是否有帮助,我收到的错误如下:
EntityFramework6\Add-Migration initial
在程序集“MyProject”中找不到迁移配置类型。 (在 Visual Studio 中,您可以使用包管理器控制台中的 Enable-Migrations 命令添加迁移配置)。
EntityFrameworkCore\Add-Migration initial
无法创建“EntityContext”类型的对象。有关设计时支持的不同模式,请参阅https://go.microsoft.com/fwlink/?linkid=851728
我不确定我做错了什么。请提出建议。
【问题讨论】:
你应该使用services.AddDbContext<EntityContext>
而不是services.AddDbContext<Entity>
那是错误的,我很抱歉。我已经改正了
【参考方案1】:
Azure Functions请参考微软官方文档link。
在您的情况下,将 Startup
类更改为:
[assembly: FunctionsStartup(typeof(MyProject.Startup))]
namespace MyProject
public class Startup : FunctionsStartup
public override void Configure(IFunctionsHostBuilder builder)
builder.Services.AddDbContext<EntityContext>(options=>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddScoped<IUserRepository, UserRepository>();
也在 DbContext 类中 (EntityContext.cs
):
public DbSet<User> User get; set;
//Removed s from Users
//Also remove s from Users in the file `UserRepository.cs`
最后在local.settings.json
中:
"IsEncrypted": false,
"Values":
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"DefaultConnection": "Data Source= ;Initial Catalog=;User ID=;Password= ;MultipleActiveResultSets= True;Persist Security Info=True;"
【讨论】:
以上是关于使用 DBContext 将 SQL Server 数据库与时间触发的 Azure 函数连接起来的主要内容,如果未能解决你的问题,请参考以下文章
如何将参数传递给 DbContext.Database.ExecuteSqlCommand 方法?
我可以通过在 EF Core 和 SQL Server 中的 OrderBy() 之前使用 Where() 来提高查询的性能吗?