使用 DBContext 将 SQL 服务器数据库与时间触发的 Azure 函数连接
Connecting SQL Server database with time-triggered Azure Function using DBContext
我是 Azure Functions 的新手,在将它与 SQL 服务器数据库连接时遇到问题。我正在使用 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
我也咨询过,但没有帮助。
我也遇到了错误
Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'MyProject.Models.Repository.IUserRepository' while attempting to activate 'MyProject.Function1'.
我还在某个地方学会了使用包管理器控制台来添加迁移,但我不确定它是否有帮助,我收到的错误如下:
EntityFramework6\Add-Migration initial
No migrations configuration type was found in the assembly 'MyProject'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).
EntityFrameworkCore\Add-Migration initial
Unable to create an object of type 'EntityContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
我不确定我做错了什么。请提出建议。
Azure Functions请参考微软官方文档link
在您的情况下,将 Startup
class 更改为:
[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 class (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;"
}
}
我是 Azure Functions 的新手,在将它与 SQL 服务器数据库连接时遇到问题。我正在使用 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
我也咨询过
我也遇到了错误
Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'MyProject.Models.Repository.IUserRepository' while attempting to activate 'MyProject.Function1'.
我还在某个地方学会了使用包管理器控制台来添加迁移,但我不确定它是否有帮助,我收到的错误如下:
EntityFramework6\Add-Migration initial
No migrations configuration type was found in the assembly 'MyProject'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).
EntityFrameworkCore\Add-Migration initial
Unable to create an object of type 'EntityContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
我不确定我做错了什么。请提出建议。
Azure Functions请参考微软官方文档link
在您的情况下,将 Startup
class 更改为:
[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 class (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;"
}
}