2013-12-18 3 views
1

Я абстрагирую свой уровень доступа к данным в централизованном обобщенном абстрактном классе, чтобы мои другие типы конкретных классов могли просто вызвать общие методы без определения реализации.Проблема полностью абстрагирования метода доступа к данным

public abstract class _DALMethods<T> 
{ 
    public virtual List<T> GetAll() 
    { 
     List<T> ents = new List<T>(); 

     using (var db = new Entities()) 
     { 
      ents = db.tblEmployees.ToList(); 
     } 

     return ents; 
    } 

    public virtual void Add(T obj) 
    { 
     using (var db = new Entities()) 
     { 
      db.tblEmployees.Add(obj); 
      db.SaveChanges(); 
     } 
    } 
} 

Моя проблема заключается в том, как «родовой-ISE» очень конкретный вызов сотрудника таблицы DbSet список, особенно когда это требует создания экземпляров EF сущностей.

using (var db = new Entities()) 
{ 
    ents = db.tblEmployees.ToList(); 
} 

EDIT: Я добавил еще один метод абстрактного класса, который я буду использовать. Как бы я сделал то же самое для этого?

+0

Per вашего обновления это то же самое. –

ответ

1

Похоже, вы спрашиваете, пару вопросов. Во-первых, если вы хотите Сущности конструктор часть порождающим, вы должны добавить общий параметр для вас класс, может быть, как это:

public abstract class _DALMethods<TEntities, T> where TEntities : DbContext, new() where T: class 

Тогда вы можете позвонить:

using (var db = new TEntities()) 

Во-вторых , чтобы получить объекты обобщенно можно использовать

db.Set<T>().ToList(); 

Что будет возвращать все объекты из DbSet

Для вашего метода надстройки, что-то, как это должно помочь:

Заменить

db.tblEmployees.Add(obj); 

с

db.Entry(obj).State = EntityState.Added; 
+0

Я получаю много ошибок когда я реализую это.'TEntities должны быть конвертируемыми в IDisposable' и' Невозможно создать экземпляр TEntities, потому что у него нет нового() ограничения – Lee

+0

Извините, забыли добавить ограничения в класс –

+0

Это замечательно. Что означает «TModel»? – Lee

3

Похоже, это может работать:

List<T> ents = new List<T>(); 

using (var db = new Entities()) 
{ 
    //ents = db.Set<T>().ToList(T); 
    // correction due to Kyle and Lee below 
    ents = db.Set<T>().ToList<T>(); 
} 

return ents; 

(я использую EF 6). Set<T> возвращает DbSet<T>.

Приветствия -

+0

'T' не может использоваться в качестве аргумента ToList. Кроме того, первое назначение для ents не требуется (ents либо перезаписывается, либо генерируется исключение, и выполнение никогда не приводит к возврату оператора). – Kyle

+0

@Kyle прав. Я получаю ошибки при попытке этого: «T - тип и используется как переменная», а «Тип T должен быть ссылочным типом, чтобы использовать его как параметр» – Lee

+0

Извинения: это должно было быть ToList (); –

3

Похоже, что вы ищете метод DbContext.Set<T>():

public virtual List<T> GetAll() 
{ 
    using (var db = new Entities()) 
    { 
     return db.Set<T>().ToList(); 
    } 
} 

затем:

var dal = new _DALMethods<Employee>(); 
var employees = dal.GetAll(); // returns a List<Employee> 
Смежные вопросы