2017-11-07 2 views
0

Ok, ich könnte hier über meine Gehaltsstufe lochen, aber ich versuche, eine generische CRUD-Routine für und EF-Projekt zu erstellen. Ich habe das meiste am Laufen, aber ich drehe mich in einem Punkt herum.Entity Framework Set mit Generic Class

Normalerweise tun Sie so etwas wie dies eine Einheit durch einen kontext-

DBContext.MyClass.Add(p); // p = instance of MyClass 

hinzuzufügen, das gut funktioniert, aber da in einer globalen Methode, um alle zu handhaben fügt unabhängig davon, welche Klasse sie sind ich vorbei in ein Modell als Objekt würde es eher wie this-

aussieht
DBContext<whateverobject>.Add(whateverobject); // my objects is an object param passed into the method 

ich habe eine Reihe von typeofs versucht zu tun und dort, wo T: Klasse Sachen, aber ich bin kein Glück. Jede Richtung in die richtige Richtung würde mir helfen.

Ich bin mit EF Core 2 so auch meine Möglichkeiten als EF geringer ausfallen könnten 6.

Dank.

+1

ist das sinnvoll: https://stackoverflow.com/questions/30675564/in-entity-framework-how-do-i-add-a-generic-entity- to-its-korrespondent-dbset-wi –

+0

Erik, ich glaube, das bringt mich auf den richtigen Weg, wenn du es als Antwort nennst, werde ich dir dafür Kredit geben. – infocyde

+1

Teste es zuerst, dann beantworte ich es :) Ich möchte nicht, dass andere Leute das nicht finden, weil es falsch ist. –

Antwort

3

Die Methode, die Sie suchen ist DbContext ‚s Set<T>()

Ihre generische Repository für Ihre generische CRUD etwas würde wie folgt aussehen:

public class Repo<T> where T: class 
{ 
    private readonly DbSet<T> _set; 

    public Repo(DbContext dbContext) 
    { 
     _set = dbContext.Set<T>(); 
    } 

    public void Add(T entity) => _set.Add(entity); 
} 

Dieses Beispiel enthält eine vielleicht ungewöhnliche Sache:

where T: class: wir müssen angeben, dass T ein Referenztyp sein muss, weil DbSet<T> expects T to be a reference type


Für generische Abfragen könnten Sie Erweiterungsmethoden verwenden. Um eine ById Methode zu implementieren, müssen Sie angeben, dass der Typ T über eine Schnittstelle eine Id Eigenschaft haben muss. in etwa so aussehen, dass würde:

public interface IEntity 
{ 
    int Id { get; set; } 
} 

public class User : IEntity 
{ 
    public int Id { get; set; } 
} 

public static class DbSetExtensions 
{ 
    public static T ById<T>(this DbSet<T> dbSet, int id) where T: class => 
     dbSet.FirstOrDefault(entity => entity.Id == id); 
} 
+0

Das ist eine großartige Antwort, aber ich habe bereits versprochen, dass ich Erik Philips die Antwort geben würde, die mich gestern in die richtige Richtung wies. Aber für Leute, die nach dem Weg suchen, ist dies auch ein guter Ausgangspunkt. – infocyde

+0

Danke für das Kompliment. Ich hoffe nur, dass du dein Problem lösen kannst –