我对使用实体框架使用Code First Migrations进行编码。我正在使用一个自定义的构造函数,该构造函数具有特定于应用程序中登录的某个用户的连接字符串。使用自定义构造函数进行代码优先迁移
当应用程序加载时,如果数据库上下文有任何更改,我想用用户连接字符串初始化数据库并将其迁移到最新版本。我正在使用结构图来注入工作单元。
全球ASAX
ObjectFactory.Configure(cfg =>
{
cfg.AddRegistry(new StandardRegistry());
cfg.AddRegistry(new ControllerRegistry());
cfg.AddRegistry(new ActionFilterRegistry(() => Container ?? ObjectFactory.Container));
cfg.AddRegistry(new MvcRegistry());
cfg.AddRegistry(new TaskRegistry());
cfg.AddRegistry(new ModelMetadataRegistry());
});
StandardRegistry类
For<ICustomerUnitOfWork>().Use(new CustomerUnitOfWork(new CustomerContext()));
For<CustomerContext>().Use(new CustomerContext());
在这一点上我不当知道用户的ConnectionString因为用户没有登录。问题模型已经改变,结构图会引发异常,因为上下文模型已经改变。
语境
private static string _connectionString;
static CustomerContext()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<CustomerContext, Configuration>());
}
public CustomerContext()
: base(string.IsNullOrEmpty(_connectionString) ? "FooDatabase" : _connectionString)
{
if (string.IsNullOrEmpty(_connectionString))
Database.SetInitializer(new CustomerContextInitializer());
}
public CustomerContext(string connectionString)
: base(connectionString)
{
if (string.IsNullOrEmpty(_connectionString))
Database.SetInitializer(new CustomerContextInitializer());
_connectionString = connectionString;
}
CustomerContextInitializer
public class CustomerContextInitializer : CreateDatabaseIfNotExists<CustomerContext>
{
protected override void Seed(CustomerContext context)
{
var informationService = new InformationService
{
ObjectState = ObjectState.Added,
ConnectorClass =
"Conexio.InformationService.Contracts.IInformationService, Conexio.InformationService.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
DisplayName = "IInformationService"
};
是有办法的规则添加到standardRegistry类运行时调用与ConnectionString中constructur?还是有另一种方法来解决这个问题?