我正在.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,我该怎么做 使用结构图时?
类似的东西:
string myNewConnection = "connection";
var t = _locationManager.setConnection(myNewConnection).GetAll();
我该怎么做?
注意:上面的代码不完整,我仍在尝试解决此问题。
答案 0 :(得分:1)
我猜您的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 ..)