繁体   English   中英

实体框架的C#数据库抽象类

[英]C# database abstraction class with Entity Framework

我想创建一个通用的数据库抽象,以便公开相同的接口,而不必担心数据库管理的DbContext的类型。

这里有一个例子可以很好地解释这个概念:

public interface IDatabase<T> where T : DbContext {
    void Add<T>(T entity);
    void Remove<T>(T entity);
    void SaveChanges();
}

实现可以是:

public MyDatabase<T> : IDatabase<T> where T : MyContext {
    public T Context { get; private set; }

    //singleton contructor ...

    public void Add<TC>(TC entity) {
        Context.Set<TC>().Add(entity);
    }

    public void Remove<TC>(TC entity) {
        Context.Set<TC>().Add(entity);
    }

    public void SaveChanges {
        Context.SaveChanges();
    }
}

此设计的目标是不同的:公开相同的接口以使逻辑与数据库脱钩,快速更改数据库(上下文),创建上下文一次并在所有应用程序生存期内重用(需要锁定机制)。

问题在于该接口在上下文中隐藏了集合的所有类型。

Context.Set<TC>().Add(entity);    //this line don't compile

我不确定这种设计是否是最佳实践。 如何实现提供这些功能的设计?

为什么不使用标准模式(例如存储库模式),也可以将其与UnitOfWork结合使用。 您会为自己弄复杂,只需检查一下即可。

 public interface IMyClassRepository : IDisposable
  {
    IQueryable<MyClass> All { get; }
    IQueryable<MyClass> AllIncluding(params Expression<Func<MyClass, object>>[] includeProperties);
    MyClass Find(int id);
    void InsertOrUpdate(MyClass myClass);
    void Delete(int id);
    void Save();
  }

  public class MyClassRepository : IMyClassRepository
  {
    DBContext context = new DBContext();
    public IQueryable<MyClass> All
    {
      get { return context.Employees; }
    }
    public IQueryable<MyClass> AllIncluding(params Expression<Func<MyClass, object>>[] includeProperties)
    {
      IQueryable<MyClass> query = context.MyClasses;
      foreach (var includeProperty in includeProperties)
      {
        query = query.Include(includeProperty);
      }
      return query;
    }
    public MyClass Find(int id)
    {
      return context.MyClasses.Find(id);
    }
    public void InsertOrUpdate(MyClass myClass)
    {
      if (myClass.Id == default(int))
      {
        // New entity
        context.MyClasses.Add(myClass);
      }
      else
      {
        // Existing entity
        context.Entry(myClass).State = EntityState.Modified;
      }
    }
    public void Delete(int id)
    {
      var employee = context.Employees.Find(id);
      context.Employees.Remove(employee);
    }
    public void Save()
    {
      context.SaveChanges();
    }
    public void Dispose()
    {
      context.Dispose();
    }
  }

  public class MyClass
  {
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM