如何从一个数据库上下文故障转移到另一个数据库

时间:2019-07-01 13:44:36

标签: c# entity-framework dbcontext

我正在开发一个开放源代码项目,该项目将允许开发人员集成azure密钥保管库以在运行时获取机密,并在当前凭证过时的情况下自动故障转移到一组备份凭证。

当前,它适用于Azure Service Bus,我可以在其中旋转凭据,捕获失败,使用相同的对象重新发出相同的请求,然后代码以一种愉快的方式进行。

在我目前尝试该解决方案时,我注意到您可以整天运行DbContext.Add(entity),但实际上不会失败,直到DbContext.Save()方法运行为止。发生这种情况时,将从上下文工厂中生成一个新的dbContext,但是在调用“保存更改”之前,我需要保留从Add,Update,Delete调用的所有更改。

这是我用来在失败时“重试”的通用方法,只要不需要将任何内容传递给下一个DbContext,此重试逻辑就可以工作。

注意:传递给DbContext的“ Args”是用于创建新连接字符串的用户名和密码。

_keySet管理“活动”凭证和过期凭证。

private G GenericRetry<G>(Func<G> retryMethod)
        {
            G result = default(G);
            try
            {
                result = retryMethod();
            }
            catch (DbUpdateException exp)
            {
                _keySet.Rotate();
                string[] args = new string[] { _keySet.Active.Identifier, _keySet.Active.Token };
                _activeContext = _contextFactory.CreateDbContext(args);
                result = GenericRetry(retryMethod);
                _keySet.Refresh();
            }
            return result;
        }

        private G GenericRetry<L,G>(Func<L, G> retryMethod, L parameter)
        {
            G result = default(G);
            try
            {
                result = retryMethod(parameter);
            }
            catch(DbUpdateException exp)
            {
                _keySet.Rotate();
                string[] args = new string[] { _keySet.Active.Identifier, _keySet.Active.Token };
                _activeContext = _contextFactory.CreateDbContext(args);
                result = GenericRetry(retryMethod, parameter);
                _keySet.Refresh();
            }
            return result;
        }

关于如何将无效的DbContext切换为新的import React, { useState } from 'react'; import { View, Text, StyleSheet, Platform } from 'react-native'; import AppIntroSlider from 'react-native-app-intro-slider'; import Main from './Component/Main'; import Picture from './Component/Picture'; import CurrentWeather from './Component/CurrentWeather'; const slides = [ { key: '1', component: <Main />, }, { key: '2', component: <Picture />, }, { key: '3', component: <CurrentWeather />, }, ]; const App = () => { const [show, setShow] = useState(false); const on_Done_all_slides = () => { setShow(true); }; const on_Skip_slides = () => { setShow(true); }; if (show) { return ( <View> <Text> Welcome </Text> </View> ); } else { return ( <AppIntroSlider slides={slides} onDone={on_Done_all_slides} showSkipButton={true} onSkip={on_Skip_slides} /> ); } }; export default App; 并保留所有未完成的更改的任何建议?

0 个答案:

没有答案