2016-10-11 5 views
0

Ich verbringe so viel Zeit, um eine generische Methode versucht, implementieren hinzuzufügen, oder eine Einheit mit einer verwandten Entität zu aktualisieren (Beziehung one to many), aber ich bin fest ...Entity Framework 6: generische Methode AddOrUpdate

Das Verfahren muss empfängt 2 Parameter, der erste ist der Elternteil, der zweite ist das Kind. Das Ziel ist, Kind Entität in Mutter zu speichern (Hinzufügen, wenn nicht oder Aktualisierung vorhanden ist)

Es ist die allgemeine Methode Unterschrift:

public static bool AddOrUpdate<T,U>(T ItemToSave,U ItemRelated, int ID) where T : class where U : class 
    { 
     using (var context = new dbContext()) 
     {     
      var parent = context.Set<T>().Find(ID); 
      if (parent == null) return; 
      // how to retrieve now the child (ItemRelated) from the parent (ItemToSave) in order to add into it or update ? 

      return context.SaveChanges() > 0; 
     } 
    } 

Diese Methode in einer statischen Klasse ‚Service‘ und mich entfernt Ich möchte Service.AddOrUpdate (Order _order, OrderLine _orderline, _order.OrderId) aus jeder Klasse aufrufen können.

Ich bin fest auf das Abrufen des Kindes von Eltern und Hinzufügen oder Aktualisieren in es.

Kann mir bitte jemand helfen, das zu erreichen?

+0

Also was hast du genau versucht? "??" wird offensichtlich nicht funktionieren –

+0

Entschuldigung Ich habe meine Frage –

+0

nein sie sind 2 Entity Set, ItemToSave kann 0 oder mehr haben ItemRelated –

Antwort

0

Ihr ItemRrelated sollte eine Schnittstelle mit der Eigenschaft parentId implementieren. Dann können Sie es einfach zu DbSet hinzufügen, wenn es nicht bereits existiert.

dann, wenn es nicht existiert, füge es hinzu oder bearbeite es, wenn es existiert.

EDIT

, wenn Sie auch, wenn Kinder Einheiten hat die gleiche Mutter

public static bool AddOrUpdate<T, U>(T ItemToSave, U ItemRelated, int ID, Expression<Func<U,bool>> sameParentsExpression) where T : class where U : class 
{ 
    using (var context = new dbContext()) 
    { 
     var parent = context.Set<T>().Find(ID); 
     if (parent == null) return false; 
     // how to retrieve now the child (ItemRelated) from the parent (ItemToSave) in order to add into it or update ? 
     var existingItemRelated = context.Set<U>() 
            .Where(sameParentsExpression) 
            .SingleOrDefault(/*your criteria to determine if child item equals the one in DB*/); 

     return context.SaveChanges() > 0; 
    } 
} 

Bestimmung nicht mit übergeordneten Elementen gemeinsame Schnittstelle für Unternehmen haben möchten, können Sie zum Ausdruck dieser Methode übergeben und rufen Sie dafür wie

AddOrUpdate(order, orderline, order.OrderId, ol => ol.OrderId == order.OrderId) 
+0

"ir.ParentId" funktioniert nicht, weil wir nicht über Primärschlüssel des Elternteils wissen, weil es sein wird generisch (T kann eine beliebige Klasse sein) –

+0

T kann eine beliebige Klasse sein, die nicht mit der übergeordneten Klasse des Kindes verknüpft ist. Und U-Klasse sollte eine Schnittstelle mit ParentId-Eigenschaft implementieren, wie ich schon sagte. Mit anderen Worten, Sie sollten U als "where U: IChildWithParentId" einschränken. –

+0

Konstantin Ershov Ich habe Ihnen in meiner Frage mehr Erklärungen dazu gegeben, können Sie Ihre Lösung bitte expliziter beschreiben? –

0

Mit den gegebenen Einschränkungen ist es einfach nicht möglich. Denken Sie darüber nach - die einzige Beschränkung, die Sie gegeben haben, ist, dass jede Klasse sein muss. Dies garantiert nicht, dass es eine Eltern-Kind-Beziehung gibt, geschweige denn, wie diese Beziehung definiert wird.

Generika sind keine Magie. Sie ermöglichen Ihnen einfach, mit Objekten auf eine vordefinierte Weise umzugehen. Und die Definition der Interaktion MUSS existieren, bevor wir eine generische Methode schreiben.

Verwandte Themen