我有一个带有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传递它?
答案 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;
}
}
这样,您就可以通过其存储库与多个数据库进行通信。相同的引擎/服务可以从不同的数据库中注入存储库。