小编ozz*_*ald的帖子

用户登录时,ASP.NET Core更改EF连接字符串

经过几个小时的研究,发现无法做到这一点; 是时候提问了.

我有一个使用EF Core和MVC的ASP.NET Core 1.1项目,供多个客户使用.每个客户都有自己的数据库,具有完全相同的模式.该项目目前是一个迁移到Web的Windows应用程序.在登录屏幕上,用户有三个字段,公司代码,用户名和密码.我需要能够在用户尝试根据他们在公司代码输入中键入的内容进行登录时更改连接字符串,然后在整个会话期间记住他们的输入.

我找到了一些方法可以使用一个数据库和多个模式执行此操作,但没有一个使用相同模式的多个数据库.

我解决这个问题的方法不是问题的实际解决方案,而是一个解决这个问题的方法.我的数据库和应用程序托管在Azure上.我对此的修复是将我的应用服务升级到支持插槽的计划(5个插槽每月只需额外支付20美元).每个插槽都有相同的程序,但保存连接字符串的环境变量是公司特定的.这样我也可以根据需要对每个公司进行子域名访问.虽然这种做法可能不像其他人那样做,但对我来说这是最具成本效益的.发布到每个插槽比在花费时间进行其他无法正常工作的编程更容易.在微软轻松更改连接字符串之前,这是我的解决方案.

回应Herzl的回答

这似乎可行.我试图让它实现.我正在做的一件事是使用访问我的上下文的存储库类.我的控制器将注入的存储库注入其中以调用访问上下文的存储库中的方法.我如何在存储库类中执行此操作.我的存储库中没有OnActionExecuting重载.此外,如果会话持续存在,当用户再次向应用程序打开浏览器并且仍然使用持续7天的cookie登录时会发生什么?这不是新会议吗?听起来应用程序会抛出异常,因为会话变量将为null,因此没有完整的连接字符串.我想我也可以将它存储为一个Claim,如果session变量为null,则使用Claim.

这是我的存储库类.IDbContextService是ProgramContext,但我开始添加你的建议,试着让它工作.

public class ProjectRepository : IProjectRepository
{
    private IDbContextService _context;
    private ILogger<ProjectRepository> _logger;
    private UserManager<ApplicationUser> _userManager;

    public ProjectRepository(IDbContextService context,
                            ILogger<ProjectRepository> logger,
                            UserManager<ApplicationUser> userManger)
    {
        _context = context;
        _logger = logger;
        _userManager = userManger;
    }

    public async Task<bool> SaveChangesAsync()
    {
        return (await _context.SaveChangesAsync()) > 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

回应FORCE JB的回答

我试图实现你的方法.我在Program.cs上得到一个例外

host.Run();
Run Code Online (Sandbox Code Playgroud)

这是我的'Program.cs'课程.不变.

using System.IO;
using Microsoft.AspNetCore.Hosting;

namespace Project
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc asp.net-identity entity-framework-core asp.net-core

10
推荐指数
3
解决办法
2万
查看次数

仅在横向扩展的 Azure 应用服务的一个实例上运行 IHostedService

是否可以IHostedService在 ASP.NET Core 中仅在一个横向扩展的 Azure 应用服务实例上运行?IHostedService或者解决方案是在一个实例的自己的应用程序服务中运行它?

我有一个BackgroundService每天运行一次并通过电子邮件发送报告的程序。当我的应用服务扩展到 2 个实例时,该服务将每天同时运行两次,从而导致发送两封相同的电子邮件。

我怎么解决这个问题?

autoscaling azure-web-app-service asp.net-core asp.net-core-hosted-services

6
推荐指数
1
解决办法
3222
查看次数

如何使用 .NET Core 的通用主机运行 Win Forms 并让它控制主机生命周期?

如何使用 .NET Core 的通用主机运行 Win Forms 并让它控制主机生命周期?我想使用主机的默认构建器并使用扩展方法来添加我的启动表单。我希望主机在启动表单关闭时关闭。

winforms .net-core

3
推荐指数
1
解决办法
2918
查看次数