Это старый вопрос, но он все еще открыт, так что, может быть, он кому-нибудь пригодится. Мое решение для этой ситуации заключается в использовании класса abstrat с универсальными типами, реализующими базовые операции, такие как выбор, вставка, обновление или удаление.
Мой базовый класс выглядит так:
public abstract class MyContext<T, key> : IDisposable where T : class {
private DbEntities db; //my database context
private DbSet<T> entities; //specific set
protected MyContext(DbEntities db) {
entities = db.Set<T>();
this.db = db;
}
public T Add(T entity) {
entities.Add(entity);
db.SaveChanges();
return entity;
}
public T Get(key id) {
return entities.Find(id);
}
public List<T> GetAll() {
return entities.ToList();
}
public void Delete(key id) {
T objectToDelete=entities.Find(id);
if(objectToDelete!=null){
entities.Remove(objectToDelete);
db.SaveChanges();
}
}
public void Delete(T entity) {
entities.Remove(entity);
db.SaveChanges();
}
public void Delete(List<T> items) {
foreach (T entity in items) {
entities.Remove(entity);
}
db.SaveChanges();
}
public void Update(T entity) {
entities.Attach(entity);
db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
}
public abstract void Dispose();
}
Конкретный пример класса
public class PermissionDataBase : MyContext<Permission,int>{
//Mapped class Permission where the key is int
private DbEntities db=null;
public PermissionDataBase(DbEntities db):base(db) {
this.db = db;
}
//Additional methods (if required)
public Permission FindByName(string name) {
return db.Permissions.FirstOrDefault(p => p.Name == name);
}
public override void Dispose() {
db.Dispose();
}
}
Тестирование
public class ModelsTest {
[TestMethod]
public void TestMethod1() {
DbEntities db = new DbEntities();
using (PermissionDataBase permissionDb = new PermissionDataBase(db)) {
Permission newEntity = new Permission() {
Name = "Test1"
};
permissionDb.Add(newEntity);
Assert.IsTrue(newEntity.Id > 0);
}
}
[TestMethod]
public void TestMethod2() {
DbEntities db = new DbEntities();
using (PermissionDataBase permissionDb = new PermissionDataBase(db)) {
List<Permission> items = permissionDb.GetAll();
Assert.IsTrue(items.Count > 0);
}
}
[TestMethod]
public void TestMethod3() {
DbEntities db = new DbEntities();
using (PermissionDataBase permissionDb = new PermissionDataBase(db)) {
Permission toDelete = permissionDb.Get(3); //Assuming id=3 exists
permissionDb.Delete(toDelete);
Permission deleted = permissionDb.Get(3);
Assert.IsNull(deleted);
}
}
}
Этот код работает с Entity Framework 5 в Visual Studio Community 2013.