2017-11-12 1 views
0
public class Hardware 
{ 
    public int id { get; set; } 
    public int Nodes { get; set; } 
    public int Repeaters { get; set; } 
    public int Hubs { get; set; } 

} 

public abstract class Repositories<T> where T:class 
{ 
    //where T:class fixes the issue with .SET 


    //Repository class constructor once initialized will instantiate datamodel 
    //Manufacturing data model instantiate because it models table 

    ManufacturingDataModel MDM; 
    public Repositories(ManufacturingDataModel mdm) 
    { 
     MDM = mdm; 
    } 

    public List<T> GetHardware() 
    { 
     //Creating new list and adding data from db in it 

     List<T> data = new List<T>(); 
     foreach(var i in MDM.Set<T>()) 
     { 
      data.Add(i); 
     } 
     return data; 
    } 

    public void AddHardware(T item) 
    { 
     MDM.Set<T>().Add(item); 
     MDM.SaveChanges(); 

    } 


    public void RemoveHardware(T item) 
    { 
     MDM.Set<T>().Remove(item); 
     MDM.SaveChanges(); 
    } 

    public void UpdateHardware(T item) 
    { 
     MDM.Set<T>().AddOrUpdate(item); 
     MDM.SaveChanges(); 
    } 



public class Test : Repositories<Hardware> 
{ 
    public Test(ManufacturingDataModel mdm) : base(mdm) 
    { 
    } 



static void Main(string[] args) 
    { 
     ManufacturingDataModel MDM = new ManufacturingDataModel(); 
     Test t = new Test(MDM); 

     Hardware hardware = new Hardware(); 

     hardware.Nodes = 55; 
     hardware.Repeaters = 46; 
     hardware.Hubs = 82; 



     t.AddHardware(hardware); // WORKS 

     t.RemoveHardware(hardware); //DOES NOT WORK 

enter image description hereRepository entfernen Methode nicht funktioniert - Objekt nicht

finde ich versuche, ein funktionierendes Repository zu machen Elemente aus meiner db Tabelle hinzufügen/entfernen. Das Problem, mit dem ich konfrontiert bin, ist, dass die add-Methode perfekt funktioniert, die Entfernung aber nicht. Das Problem mit der Methode remove wie im Bild gezeigt ist, dass das Objekt nicht existiert. Ich habe verschiedene Dinge ausprobiert, wie zum Beispiel meine remove-Methode zu DeleteObject und Attach ändern, aber nichts scheint zu funktionieren. Irgendwelche Ideen? ADO -> Code zuerst -> EF -> Repo Klasse

Antwort

0

Sie zuerst das Element, das Sie entfernen möchten, holen müssen und entfernen es:

public void RemoveHardware(T item) 
{ 
    var dbItem = MDM.Set<T>().FirstOrDefault(x=>x.Id == item.Id); 
    if(dbItem!=null) 
    { 
     MDM.Set<T>().Remove(dbItem); 
     MDM.SaveChanges(); 
    } 
} 

aktualisieren

wie es here angegeben, DbSet.Remove

Marks the given entity as Deleted such that it will be deleted from the database when SaveChanges is called. Note that the entity must exist in the context in some other state before this method is called.

in Ihrem Fall ist das Element in Ihrem Kontext nicht ein d dies ist der Grund, warum Sie die folgenden Fehler anzeigen:

The object cannot be deleted because it was not found in the ObjectStateManager

Wenn das Element im Kontext war dann als richtig hat Rainman unten in seinem Kommentar darauf hingewiesen, woulnd't sie die zusätzliche Hin- und Rück an die Datenbank vornehmen müssen um den Gegenstand zu holen.

+1

In Ihrem Szenario, wenn wir "item.Id" Informationen haben, müssen wir die Entität nicht erneut abfragen. Es trifft die Datenbank zweimal. – lucky

+0

Wie Sie hier lesen können https://msdn.microsoft.com/en-us/library/system.data.entity.dbset.remove(v=vs.113).aspx, Die 'Remove' * Markiert die angegebene Entität So gelöscht, dass es beim Aufruf von SaveChanges aus der Datenbank gelöscht wird. ** Beachten Sie, dass die Entität vor dem Aufruf dieser Methode im Kontext ** in einem anderen Status vorhanden sein muss. * Wenn jemand das Löschen eines Elements anfordert, steht dies normalerweise nicht im Kontext. Deshalb habe ich das gesagt und deshalb sehe das OP diesen Fehler. – Christos

+1

Ja, Sie haben Recht. Wir müssen die Entität anfügen, damit sie im Kontext existiert, bevor wir versuchen, sie zu löschen. Ich habe meine Antwort aktualisiert. – lucky

0

Sie benötigen eindeutige ID (meist Primärschlüssel) für Hardware Gebilde zu gründen. Es ist so etwas;

 Hardware hardware = new Hardware(); 

     hardware.Id = 1 //Set your unique Id here 
     hardware.Nodes = 55; //Not necessary 
     hardware.Repeaters = 46; //Not necessary 
     hardware.Hubs = 82; //Not necessary 
     RemoveHardware(hardware); 

     // So edit your RemoveHardware method too like this 
     public void RemoveHardware(T item) 
     { 
      MDM.Set<T>().Attach(item); 
      MDM.Set<T>().Remove(item); 
      MDM.SaveChanges(); 
     } 
0

Wenn Sie wollen, dass es funktioniert, sobald das Objekt eingefügt wurde sie aus der Datenbank abrufen und in der RemoveHardware-Methode übergeben.

Da Sie ein Objekt ohne den Primärschlüssel übergeben, erhalten Sie diesen Fehler.

Verwandte Themen