Wie füge ich in Entity Framework dem entsprechenden DbSet eine generische Entität hinzu, ohne eine switch-statement, die alle möglichen DbSets aufführt?

Ich habe zwei Arten von Entitäten: eine Angestellteneinheit und eine Büroeinheit mit einer Eins-zu-Viele-Beziehung zwischen den beiden, so dass viele Mitarbeiter für ein Büro vorhanden sind. Für EF wird für jede Entität ein DbSet in der Kontextdatei erstellt:

public DbSet Offices { get; set; } public DbSet Employees { get; set; } 

In einem EF-Tutorial habe ich meine CRUD-Methoden für eine bestimmte Entität durchgeführt. Die folgende Methode erstellt beispielsweise ein Büro und fügt es dem Büro-DbSet hinzu (ignorieren Sie die MVC-Daten – das mache ich nicht mehr):

 public ActionResult Create([Bind(Include = "Address,BusinessName")] Office office) { try { if (ModelState.IsValid) { db.Offices.Add(office); db.SaveChanges(); return RedirectToAction("Index"); } } catch (DataException /* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator."); } return View(office); } 

Die zwei Dinge, die ich betonen möchte, sind im Wesentlichen, dass ein Office-Objekt an die Methode übergeben wird und das Office zum Office-DbSet hinzugefügt wird, indem db.Offices explizit geschrieben wird:

 db.Offices.Add(office); 

Ich muss jedoch eine Methode schreiben, in der ein generisches Entitätsobjekt übergeben werden kann, und ich kann dieses zu seinem korrekten DbSet hinzufügen. Die grobe Idee für die Methode, die ich habe, ist ungefähr so ​​(ich habe das MVC-Zeug ignoriert):

 public void Create(object entityToCreate) { db.CorrespondingEntityType.Add(entityToCreate); db.SaveChanges(); } 

Nehmen wir also an, ich habe ein Employee-Objekt. Ich kann diesen Employee in die Create-Methode übergeben und kann sehen, dass dies ein Employee ist, und würde es dem Employees DbSet hinzufügen. Ich weiß nicht, ob EF dies unterstützt. Eine Alternative wäre, eine switch-statement abzugeben, und je nach Art der übergebenen Entität könnte ich direkt aufrufen, zu welchem ​​DbSet die Entität hinzugefügt wird. Aber ich möchte das vermeiden, weil ich mit mehr Entitäten als nur mit diesen beiden zusammenarbeiten werde. Ich werde auch für die anderen CRUD-Methoden ähnliche Dinge tun müssen.

Ich habe diese Dokumentation von msdn über die ObjectSet.AddObject-Methode gesehen , und es scheint, als wäre sie nützlich, aber ich bin mir nicht sicher, wie sie funktioniert.

    Sie könnten eine generische class wie folgt betrachten:

      public class GenericRepository : where T : class { internal YourConext context; internal DbSet dbSet; public GenericRepository(YourContext context) { this.context = context; this.dbSet = context.Set(); } public virtual void Insert(T entity) { dbSet.Add(entity); context.SaveChanges(); } } 

    Wenn Sie eine Erweiterungsmethode wie …

     public static void Create(this DbContext db, T entityToCreate) where T : class { db.Set().Add(entityToCreate); db.SaveChanges(); } 

    … C # übernimmt die Typinferenz für Sie. Sie können es einfach als nennen …

     db.Create(office); 

    … ohne sich jemals um den Typ kümmern zu müssen. Natürlich sollten Sie einen bekannten Entitätstyp eingeben.