[英]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.