簡體   English   中英

如何在運行時使用EF和Structuremap更改連接字符串?

[英]How to change connection string at runtime with EF and Structuremap?

我正在.net MVC Web應用程序中進行開發,並且正在使用EF(DB FIRST)來獲取數據:

    public class LocationManager: MyNetworkEntities,  ILocationManager
    {
        private readonly MyNetworkEntities _dbContext = new MyNetworkEntities();

        public LocationManager(MyNetworkEntities context, string connection)
        {
            // extension for changing connectionstring at runtime
            if(connection != null)
            context.ChangeDatabase
                    (
                        dataSource: connection 
                    );


        _dbContext = context;
    }

    public List<Locations> GetAll()
    {
        return _dbContext.Locations.ToList();
    }
}

還使用structuremap:

public DefaultRegistry() {
    Scan(
        scan => {
            scan.TheCallingAssembly();
            scan.WithDefaultConventions();
            scan.With(new ControllerConvention());
        });
    For<ILocationManager>().Use<LocationManager>();
}

我的控制器:

public class UserController : Controller
{
    private readonly ILocationManager _locationManager;

    public UserController(ILocationManager locationManager)
    {
        _locationManager = locationManager;
    }
    // GET: User
    public ActionResult Index()
    {
        var t = _locationManager.GetAll();
        return View("UserManagment");
    }
}

題:

由於我想在運行時更改db-connectionstring,因此在使用structuremap時該如何做?

就像是:

string myNewConnection = "connection";
 var t = _locationManager.setConnection(myNewConnection).GetAll();

我將如何做到這一點?

注意:上面的代碼不完整,我仍在嘗試解決此問題。

我猜你的EF Core DbContext看起來像這樣:

public MyDbContext(DbContextOptions<MyDbContext> options)
    : base(options)
{
}

在這種情況下,您可以只創建DbContext (不必在所有地方使用DI )並將其指向您需要的數據庫:

var connectionString = ...
var builder = new DbContextOptionsBuilder<MyDbContext>().UseSqlServer(connectionString);
var context = new MyDbContext(builder.Options);
var locations = context.Locations.ToList();

當然,您可以實現更復雜的功能,例如創建工廠類的DbContext指向您需要的地方,並通過DI注冊該工廠以通過構造函數注入機制獲得該工廠。 工廠將采用以下方法:

// This is a pseudo code below
factory.CreateDbContext (.. some parameters to detect which DB to use ..)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM