在ASP.NET MCV5中实现通用存储库

时间:2013-12-19 16:49:00

标签: c# asp.net-mvc entity-framework repository-pattern unit-of-work

我在visual studio 2013中使用ASP.NET mvc 5.我有一个过程来实现通用存储库,稍后在UnitOfWork上。我有IGenericRepository,它具有IQueryable一个功能,因为我想学习和理解所以我尽可能保持简单。我有GenericRepository类,我正在实现这个接口。我得到了从baseContext继承的FunctionContext。我有baseContext的原因是所有dbcontexts都可以使用一个路径来命中数据库但同时保持表的数量仅限于业务需求。

我在GetAll函数下的GenericRepository类中遇到错误,我相信我没有正确提取数据。

非常感谢先进......

IGernericRepository

  public interface IGenericRepository<TEntity> : IDisposable
{
    IQueryable<TEntity> GetAll { get; }

}

GenericRepository

 public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
    private FunctionsContext _Context = new FunctionsContext();

    public GenericRepository()
    {

    }

    public IQueryable<TEntity> GetAll()
    {
        /* return _Context.Functions.Select(x => new Functions
            {
                Function_ID = x.Function_ID,
                Title = x.Title,
                Hierarchy_level = x.Hierarchy_level
            });*/

        ????????????????????? need help here!
    }


    public void Dispose()
    {

    }
}

FunctionsContext

public class FunctionsContext : BaseContext<FunctionsContext>
{
    public DbSet<App_Functions> Functions { get; set; }
}

BaseContext

public class BaseContext<TContext> : DbContext where TContext : DbContext
{
    static BaseContext()
    {
        Database.SetInitializer<TContext>(null);
    }

    protected BaseContext()
        : base("name = ApplicationDbConnection")
    { }
}

功能表(型号)

[Table("Functions")]
public class App_Functions
{
     public App_Functions()
    {
      //  this.App_Controllers = new List<App_Controllers>();
    }

    [Key]
    public int Function_ID { get; set; }
    [StringLength(50)]
    [Required]
    public string Title { get; set; }
    public int Hierarchy_level { get; set; }

}

控制器类

   using (var repository = new GenericRepository<Functions>())
        {
            foreach(var functions in repository.GetAll)
            {
                var a7 = functions.Title;
               ??????
            }
        }

3 个答案:

答案 0 :(得分:4)

DbSet<TEntity>实施IQueryable<>,因此您应该能够执行此操作:

public IQueryable<TEntity> GetAll()
{
    return _Context.Functions;
}

要使其成为通用的,适用于所有类型的TEntity

public IQueryable<TEntity> GetAll()
{
    return _Context.Set<TEntity>();
}

尝试一下,让我知道它是否适合你。

答案 1 :(得分:1)

我不认为其他答案真正解决了??????位。

这样做:

public IQueryable<TEntity> GetAll()
{
    return _Context.Set<TEntity>();
}

虽然,我不会这样做。将它作为只读属性。

public IQueryable<TEntity> Entities
{
    get { return _Context.Set<TEntity>(); }
}

答案 2 :(得分:0)

// Generic Repository
public class Repository<T> where T : class
{
    private readonly DbSet<T> _dbSet;
    public Repository(DbSet<T> dbSet)
    {
        _dbSet = dbSet;
    }

    public IEnumerable<T> Where(Expression<Func<T, bool>> where)
    {
        return _dbSet.Where(where);
    }

    public T FirstOrDefault(Expression<Func<T, bool>> where)
    {
        return _dbSet.FirstOrDefault(where);
    }

    // other methods
}

// Unit of Work interface
public interface IUnitOfWork
{
    Repository<Product> ProductsRepository { get; }
}

// Unit of Work implementation
public class MyContext : DbContext, IUnitOfWork
{
    private readonly Repository<Product> _products = null;

    public DbSet<Product> Products { get; set; }

    public MyContext()
        : base("MyContext")
    {
        _products = new Repository<Product>();
    }

    public Repository<Product> ProductsRepository
    {
        get { return _products; }
    }
}