2013-02-25 18 views
7

Próbuję skonfigurować ogólny interfejs do pobierania elementów z repozytorium. Problem polega na tym, że muszę zażądać danych z usługi WCF, a produkty Generics nie działają z umowami operacyjnymi, z tego, co widzę.Entity Framework i DbSet

Mam więc ten, który działa w aplikacji konsoli, nie używając połączenia serwisowego:

public virtual List<T> GetAll<T>() where T : MyBaseType 
{ 
    return this.datacontext.Set<T>().Include(l => l.RelationshipEntity).ToList(); 
} 

jedynym sposobem mogłem zobaczyć dong to byłoby coś takiego:

public virtual List<MyBaseType> GetAll(Type entityType) 
{ 
    return this.datacontext.Set(entityType).Include(l => l.RelationshipEntity).ToList(); 
} 

Set<T>() i Set(Type type) zarówno zwracają numer DbSet, ale Set(Type type) nie ma rozszerzenia do używania ToList(), ani nie otrzymam wszystkich moich wyników z powrotem.

Właściwość Local pokazuje tylko kontekst w zakresie bieżącego wykonania, a nie zawartość repozytorium.

Więc chcę mieć umowę WCF tak:

[ServiceContract] 
public interface IRulesService 
{ 
    [OperationContract] 
    MyBaseType Add(MyBaseType entity); 

    [OperationContract] 
    List<MyBaseType> GetAll(Type type); 
} 

Następnie realizację:

public virtual List<MyBaseType> GetAll(Type entityType) 
{ 
    var dbset = this.datacontext.Set(entityType); 
    string sql = String.Format("select * from {0}s", type.Name); 

    Type listType = typeof(List<>).MakeGenericType(entityType); 
    List<MyBaseType> list = new List<MyBaseType>(); 

    IEnumerator result = dbset.SqlQuery(sql).GetEnumerator(); 

    while (result.MoveNext()){ 
     list.Add(result.Current as MyBaseType); 
    } 

    return list; 
} 

//public virtual List<T> GetAll<T>() where T : MyBaseType 
//{ 
// return this.datacontext.Set<T>().Include(l => l.RelationshipEntity).ToList(); 
//} 

public virtual MyBaseType Add(MyBaseType entity) 
{ 
    DbSet set = this.datacontext.Set(typeof(entity)); 
    set.Add(entity); 
    this.datacontext.SaveChanges(); 
    return entity; 
} 

//public virtual T Add<T>(T t) where T : MyBaseType 
//{ 
// this.datacontext.Set<T>().Add(t); 
// this.datacontext.SaveChanges(); 
// return t; 
//} 

public virtual List<MyBaseType> UpdateAll(List<MyBaseType> entities) 
{ 

} 

jakieś pomysły najlepszy podejście?

Odpowiedz

0

Powinieneś być w stanie wywołać metodę rozszerzenia Cast<T>.

public virtual List<MyBaseType> GetAll(Type entityType) 
{ 
    return this.datacontext.Set(entityType) 
     .Include(l => l.RelationshipEntity) 
     .Cast<MyBaseType>() // The magic here 
     .ToList(); 
} 
+0

'.Include()' na bierze param ciąg przy korzystaniu z 'DbSet (typ)' metody ... – Gabe

+0

Ponadto, gdy próbuję '.Cast (MyBaseType>' uzyskać wyjątek. 'Nie można utworzyć DbSet z nietypowego DbSet dla obiektów typu "MyDerivedType". – Gabe

+0

@ Gabe możesz podzielić się tym, co akurat robisz? –