c# - 使用 DBContext 将 SQL Server 数据库与时间触发的 Azure 函数连接起来
问题描述
我对 Azure Functions 非常陌生,在将它与 SQL Server 数据库连接时遇到了问题。我正在使用 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}");
}
这是我正在使用的软件包列表:
我也咨询过这个,但它并没有帮助我。
我也收到一个错误
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
我不确定我做错了什么。请建议。
解决方案
Azure Functions请参考微软官方文档的链接。
在您的情况下,将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;"
}
}
推荐阅读
- c# - 修改Windows服务可执行文件的路径
- php - Mediawiki 样式表错误
- javascript - 如何根据id连接两个div?
- c# - 实体框架 6 - 从上下文中获取实体后违反主键
- python - 如何将名称动态分配给 RFID 阅读器连接的串行端口
- c++ - 调用基类克隆实现
- xquery - 将结果连接到另一个变量 XQuery
- configuration - 警报分支上的 SOA bpel 选择活动将超时外部化
- javascript - 是否可以将 Angular HTML 表中的数据传递给组件,然后循环遍历其行进行处理?
- docker - 将证书添加到 Dockerfile (rhel7)