实体框架泛型

时间:2015-10-12 09:43:55

标签: c# entity-framework generics

背景:

在编写自己的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)它会对我的解决方案的效率产生显着影响吗?

2 个答案:

答案 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,可以定位一个数据库。它可以实现如下

  1. 创建DbContext(在您的情况下是通用的)

    public class HumanResourceContext : BaseContext<HumanResourceContext>
    {
        //DbSet properties
    }
    
    public class SalesContext : BaseContext<SalesContext>
    {
    //DbSet properties
    }
    
  2. 创建名为&#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
        { }
    }
    
  3. 这将有助于创建多个以DbContext为目标的数据库,这是正确的方法。