具有EntityFramework的通用存储库

Naz*_*azz 7 c# entity-framework repository-pattern

我想使用Entity Framework实现通用的存储库模式(我知道关于存储库有很多有争议的观点,但这仍然是我所需要的)。我希望它具有的界面如下:

public interface IRepository
{
    IQueryable<TEntity> Query<TEntity>() 
        where TEntity: Entity;

    void Save<TEntity>(TEntity entity) 
        where TEntity : Entity;

    void Delete<TEntity>(TEntity entity) 
        where TEntity : Entity;
}
Run Code Online (Sandbox Code Playgroud)

Entity是仅具有int ID属性的基类。并像这样使用它:

        IRepository repository = ... // get repository (connects to DB)
        int userId = GetCurrentUserId();
        if (!repository.Query<User>().Any(u => u.Id == userId)) // performs SELECT query
        {    /*return error*/    }

        var newOrder = new Order { UserId = userId, Status = "New" }
        repository.Save(newOrder); // performs INSERT query
        ...
        newOrder.Status = "Completed";
        repository.Save(newOrder); // performs UPDATE query
Run Code Online (Sandbox Code Playgroud)

我想避免UnitOwWork并将所有对象更改提交一次Save()Delete()调用到数据库。我想做的事情看起来很简单,但是我还没有找到任何使用EntityFramework的例子。我能找到的最接近的例子是这个答案,但是它使用了UnitOwWork和每个实体存储库,这比我需要做什么。

Dia*_*ani 3

1-创建一个接口

interface IMain<T> where T : class
    {
        List<T> GetAll();
        T GetById(int id);
        void Add(T entity);
        void Edit(T entity);
        void Del(int id);
        int Savechange();
    }
Run Code Online (Sandbox Code Playgroud)

2-创建一个类

public class Main<T> : IMain<T> where T : class
    {
        public DataContext db;
        public void Add(T entity)
        {
            db.Set<T>().Add(entity);
        }

        public void Del(int id)
        {
            var q = GetById(id);
            db.Set<T>().Remove(q);
        }

        public void Edit(T entity)
        {
            db.Entry<T>(entity).State = EntityState.Modified;
        }

        public List<T> GetAll()
        {
            return db.Set<T>().Select(a=>a).ToList();
        }

        public T GetById(int id)
        {
            return db.Set<T>().Find(id);
        }

        public int Savechange()
        {
            return db.SaveChanges();
        }
    }
Run Code Online (Sandbox Code Playgroud)

3-创建一个存储库,名称为 YourTable ForExample Student

 public class Student : Main<Tbl_Student>
    {
        public Student()
        {
            db = new DataContext();
        }
    }
Run Code Online (Sandbox Code Playgroud)

4-根据您的操作编写此代码

Student student=new Student();
student.Del(3);
int a = student.Savechange();
Run Code Online (Sandbox Code Playgroud)