如何使用多个数据库连接和存储库模式

时间:2017-04-23 05:46:56

标签: asp.net-mvc entity-framework-6 repository-pattern

我有一个带有EF和存储库模式的c#项目。

对于单个数据库,一切工作都很好但我有不同的模型,它们与不同的数据库有关,如User模型数据来自控制面板数据库,其他模型也来自不同的数据库。

这里我使用项目的公共存储库模式。现在,在初始化模型时,如何将数据库连接字符串发送到存储库?

这是我的存储库模式:

public  class Repository<C,T> : IRepository<T> where T : class where C : DbContext, new()
{
    private C _context = new C();
    public C context
    {

        get
        {

            //if (_context == null)
            //{
            //    _context = new C();
            //    _context.Database.Connection.ConnectionString = "the new connectionstring";
            //}
            //return dataContext;
            return _context;
        }
        set { _context = value; }
    }
    private IDbSet<T> _entities;
    private IDbSet<T> Entities
    {
        get
        {
            if (_entities == null)
                _entities = context.Set<T>();
            return _entities;
        }
    }

这是我的服务类

public class UserService: Repository<DyeingContext,User> , IUserRepository
{
    public UserService()
    {
        DyeingContext d = new DyeingContext(DataBase.ControlPanal);
    }
    //private readonly IRepository<User> _useRepository = new Repository<User>(new DyeingContext(DataBase.ControlPanal));   
}``

这是我的上下文类

 public partial class DyeingContext:DbContext
{
  public  DyeingContext(string pDbName):base(GetTheContext(pDbName))
  {

  }

    public DyeingContext():base()
    {
        //throw new NotImplementedException();
    }

    public static string GetTheContext(string pDbName)
  {
      return ConnectionSettings.GetConnectionStringByDbName(pDbName);
  }
}

我无法在此处获取连接字符串

DyeingContext d = new DyeingContext(DataBase.ControlPanal);

它说

  

通过类型system.argumentexception

的异常连接数据库

有没有办法将多个连接字符串传递给存储库?

我应该如何以及在哪里初始化我的连接字符串以及如何通过rerpository传递它?

1 个答案:

答案 0 :(得分:0)

我不确定您是否从上述评论中得到了答案。但这是我将如何实现这一点。

1-为每个数据库创建dbContext具体类。两者都继承自EF DbContext。

2-在配置文件中,为每个数据库创建连接字符串键。然后,此密钥作为ctr param提供给每个dbContext类。如下:

public DB1Context()
            : base("db1") // connection string key
        {
            this.Configuration.LazyLoadingEnabled = false;
            this.Configuration.ProxyCreationEnabled = false;
        }

public DB2Context()
            : base("db2") // connection string key
        {
            this.Configuration.LazyLoadingEnabled = false;
            this.Configuration.ProxyCreationEnabled = false;
        }

3-每个数据库都必须有自己的存储库。例如,AccountRepository继承自基础存储库。它的db上下文在contructor init上提供如下。

 public class AccountRepository : DataRepositoryBase<Account>, IAccountRepository
    {
        private DB1Context db1Context = new DB1Context();
        public AccountRepository()
        {
            this.DBContext = db1Context;
        }
    }

这样,您就可以通过其存储库与多个数据库进行通信。相同的引擎/服务可以从不同的数据库中注入存储库。