背景:
在编写自己的MVC应用程序时,我需要与数据库进行交互。我决定将泛型与实体框架存储库一起使用,如下所示:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
DatabaseContext<TEntity> _dbContext;
Database _database;
public IQueryable<TEntity> All
{
get
{
return (IQueryable<TEntity>) _dbContext.Items;
}
}
public Repository()
{
_dbContext = new DatabaseContext<TEntity>();
_database = _dbContext.Database;
}
}
如您所见,我也使用通用的DbContext。
我的两部分问题
我花了一些时间坐下来看看解决方案,然后继续进行。我意识到这迫使我创建多个DB上下文对象。
i)这是不好的做法吗?
ii)它会对我的解决方案的效率产生显着影响吗?
答案 0 :(得分:2)
首先,不需要具有通用上下文。您可以使用上下文对象的Set<>
属性。我也不会在存储库中创建上下文对象。而是在构造函数中传递它,因为这将允许您以其他方式注入它,并在以后的其他项目中重用它。
所以你的存储库看起来像这样:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
private DbContext _context;
public Repository(DbContext context)
{
_context = context;
}
public IQueryable<TEntity> All
{
get
{
return _context.Set<TEntity>();
}
}
}
您甚至可以在不将存储库作为通用存储库的情况下执行此操作,而只是将各个方法设置为通用,例如:
public IQueryable<TEntity> All<TEntity> where TEntity : class
{
get
{
return _context.Set<TEntity>();
}
}
答案 1 :(得分:1)
创建了多个db上下文(导致创建多个数据库),因为每个通用上下文都被视为新的数据库连接。
我们有多个dbContext,可以定位一个数据库。它可以实现如下
创建DbContext(在您的情况下是通用的)
public class HumanResourceContext : BaseContext<HumanResourceContext>
{
//DbSet properties
}
public class SalesContext : BaseContext<SalesContext>
{
//DbSet properties
}
创建名为&#34; BaseContect&#34;的类并复制此代码
public class BaseContext<TContext>
: DbContext where TContext : DbContext
{
static BaseContext()
{
//By setting it NULL, we are making it work with Existing Adventure Works database
Database.SetInitializer<TContext>(null);
}
protected BaseContext()
: base("name=AdventureWorksContext") //Points to Connection String in Config file
{ }
}
这将有助于创建多个以DbContext
为目标的数据库,这是正确的方法。