使用自定义构造函数的代码优先迁移

本文关键字:迁移 代码 自定义 构造函数 | 更新日期: 2023-09-27 17:50:49

我使用代码优先迁移与实体框架。我使用了一个自定义构造函数,它带有一个connectionstring,该字符串是特定于登录到应用程序上的某个用户的。

加载应用程序时,我希望使用用户connectionstring初始化数据库,如果数据库上下文有任何更改,则将其迁移到最新版本。我使用结构映射来注入工作单元。

全球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());
        });
<<p> StandardRegistry类/strong>
 For<ICustomerUnitOfWork>().Use(new CustomerUnitOfWork(new CustomerContext()));
        For<CustomerContext>().Use(new CustomerContext());

此时我不知道用户的connectionstring,因为用户没有登录。当模型改变时,structuremap抛出异常,因为上下文模型改变了。

<<p> 上下文/strong>
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"
        };

是否有一种方法可以在运行时将规则添加到标准注册表类中以调用带有connectionstring的构造函数?或者有没有其他方法可以解决这个问题?

使用自定义构造函数的代码优先迁移

如果我正确理解你的问题,你最好的方法是创建一个工厂类,负责在运行时创建你的ICustomerUnitOfWork实例,然后可以在你的StructureMap注册表中配置,如下所示:

this.For<ICustomerUnitOfWork>().Use(ctx => ctx.GetInstance<YourFactoryClass>().ResolveCustomerUnitOfWork());

你的ICustomerUnitOfWork将解析到你的工厂类,它可以有自己的一组依赖注入到它,以确定正确的上下文是什么。

public interface ICustomerUnitOfWork
{
}
public class YourFactoryClass
{
    public YourFactoryClass(string connectionString)
    {
    }
    public ICustomerUnitOfWork ResolveCustomerUnitOfWork()
    {
        // Perform runtime configuration
        return unitOfWork;
    }
}

我希望这对你有帮助!