带有Entity Framework的C#数据库抽象类

时间:2013-11-26 09:06:30

标签: c# database entity-framework dbcontext

我想创建一个通用的数据库抽象,以便公开相同的接口,而不必担心数据库管理的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

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

1 个答案:

答案 0 :(得分:0)

为什么不使用标准模式,例如Repository模式,您也可以将它与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
  {
  }