Мульти база данных - PullRequest
       27

Мульти база данных

0 голосов
/ 06 ноября 2019

Я знаю, что это повторяющийся вопрос, и даже здесь, но я попробовал все решения без какого-либо смысла. У меня есть основная БД, где пользователь проверяет, найден ли он, и возвращает его по собственной или связанной базе данных, которая должна изменить строку подключения на текущую используемую. Моя проблема в том, что, несмотря на то, что база данных корректна, но dbcontext работает с основной базой данных, она снова переключается. Я не понимаю, почему.

Мой applicationdbcontext равен

public ApplicationDbContext(string connectionString)
           : base(string.IsNullOrEmpty(connectionString) ? "DefaultConnection" : connectionString, throwIfV1Schema: false)
{
    this.Database.CommandTimeout = 600;
}

public static ApplicationDbContext Create(string dbCatlogConn)
{
    return new ApplicationDbContext(ConString.dbCatlogConn);
}

иэто мой открытый класс

public class ConString
{
    public static string dbCatlogConn { get; set; }
}

Это мой логин в классе accountcontroller

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl, string language = Config.DefaultLanguage)
{
    try
    {
        System.Web.Helpers.AntiForgery.Validate();
    }
    catch
    {
        return RedirectToRoute("Login", new { language, returnUrl });
    }

    dbName = model.username;

    Session["dbName"] = dbName;
    var dbname = db.SchoolLists
                   .Where(t => (t.dbname == dbName))
                   .Select(t => new { ConnString = t.ConnectionString }).ToList();

    // new conection
    dbConnectionString = "";
    Session["ConnectionString"] = dbConnectionString;
    db = new ApplicationDbContext();

    UserManager.PasswordHasher = new CustomPasswordHasher();

    bool CheckConnResult = db.Database.Exists();

    // code here
    var user = db.Users.Where(e => e.UserName.ToLower() == model.UserName.ToLower()).FirstOrDefault();
    var result = new SignInStatus();

    if (user == null)
        result = SignInStatus.Failure;
    else
    {
        string dbPassword = dal.DecryptPassword(user.AnotherUsername, user.AnotherSalt, user.PasswordHash);
        var status = UserManager.PasswordHasher.VerifyHashedPassword(dbPassword, model.Password);

        if (status == PasswordVerificationResult.Success)
            // error here
            result = await SignInManager.PasswordSignInAsync(model.UserName, user.PasswordHash, model.RememberMe, shouldLockout: false);
            // result = SignInStatus.Success;
        else
            result = SignInStatus.Failure;
    }

    switch (result)
    {
        case SignInStatus.Success:
                if (user != null)
                {
                    if (user.Disabled == true)
                    {
                        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
                        ModelState.AddModelError("", language == "Invalid login attempt.");
                        // rest the connection to default
                        // = ConString.Mainbd;
                        return View(model);
                        //return View("Lockout");
                    }
                    else
                    {


                    }
                }

                return RedirectToLocal(returnUrl);

            case SignInStatus.LockedOut:
                return View("Lockout");

            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });

            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", language == "Invalid login attempt.");
                return View(model);
        }
}

Я также пытаюсь изменить applicationdbcontext создать в файле запуска

app.CreatePerOwinContext(() => ApplicationDbContext.Create(ConString.dbCatlogConn));

но ApplicationSignInManager всегда использует основное соединение - оно не обновляется для нового после входа в систему, несмотря на то, что я правильно получил строку соединения

1 Ответ

0 голосов
/ 07 ноября 2019

Не могли бы вы попробовать создать конфигурацию, как показано ниже? а затем динамически изменить строку подключения.

public static class ApplicationDbContextConfigurer
{
    public static void Configure(
        DbContextOptionsBuilder<ApplicationDbContext> builder, string connectionString)
    {
        builder.UseSqlServer(connectionString);
    }

    public static void Configure(
        DbContextOptionsBuilder<ApplicationDbContext> builder, DbConnection connection)
    {
        builder.UseSqlServer(connection);
    }
}

enter image description here

Изменить строку подключения

DbContextOptionsBuilder<ApplicationDbContext> builder = 
    new DbContextOptionsBuilder<VineforceDbContext>();

ApplicationDbContextConfigurer.Configure(builder, connectionString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...