Laden...

Entity Framework, LINQ: Aktualisierung beim einlesen von neuen Werten (2x geändert)

Erstellt von m.grauber vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.369 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren
Entity Framework, LINQ: Aktualisierung beim einlesen von neuen Werten (2x geändert)

verwendetes Datenbanksystem: <SQL-Server, Entity Framework>

Hallo,

ich weiß, es ist schon 1000fach diskutiert worden, aber scheinbar liegt es hier an etwas anderem 😄:


MyClass _myClass = new MyClass;
_myClass=(from .. in dataEntities... where... select ...).FirstOrDefault();

EntityState ändert sich, PropertyChange wird richtig aufgerufen, alles läuft.

Nur wenn ich diese Zeilen im Code später erneut aufrufe, ändern sich nicht mehr die Werte an meinen mit {Binding} gebundenen Controls. (Ich selektiere mir dabei natürlich andere Werte heraus).

_myClass ist keine Collection, sondern eine Klasse.

Vermutlich liegt es daran:

Scheinbar darf ich die Klasse nicht überschreiben, da sonst die derzeit gebundenen Werte nicht nachvollzogen werden können. Daher ändert .NET trotz Twowaybinding und angegebenen UpdateSourceTrigger die Werte nicht beim 2. Codedurchlauf.

Ergänzt: (Selbst ein selektieren in z.B. _myClass2 und dann das zuweisen von _myClass=_myClass2 beschert mir das gleiche Problem. Wenn ich hingegen die einzelnen Werte zuweise (z.B. _myClass.Feld1=_myClass.Feld1 und _myClass.Feld2=_myClass.Feld2 etc.) klappt es hingegen, das das gebundene Objekt richtig aktualisiert wird.
⚠ Wenn nach der Änderung der DataContext aktualisiert wird, klappts, INotifyPropertyChanged kann ich nicht implementieren, da ich ja die Entities nutze.

Ist mein Lösungsansatz richtig, die Werte beim 2. Durchlauf nicht direkt in _myClass zu selektieren, sondern z.B. in _myClass2 und die Werte per "Copy" in die _myClass zu übertragen?

Falls ja, wie kann ich die Werte (bzw. einzelnen Felder) schnell hinüberkopieren? Beide Klassen sind ja identisch. Unter _myClass finde ich keine Copy-Methode und ein foreach meckert, "Eine foreach-Anweisung kann nicht für Variablen vom Typ "MyClass" verwendet werden, da "MyClass" keine öffentliche Definition für "GetEnumerator" enthält. Wie bekomme ich es sonst hin? .Copy und .Clone bekomme ich nicht angezeigt und .Clone erzeugt ja eine neue Kopie.

Microsoft schreibt dazu ja:

Anders als manche andere Sprachen stellt C# keinen Kopierkonstruktor bereit. Wenn Sie ein neues Objekt erstellen und die Werte aus einem bestehenden Objekt kopieren möchten, müssen Sie die entsprechende Methode selbst schreiben.

Liegt es überhaupt daran?

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

W
955 Beiträge seit 2010
vor 13 Jahren

Was meinst du eigtl mit "später erneut aufrufe"? Willst du die Änderungen verwerfen oder was ist der Zweck?

T
14 Beiträge seit 2010
vor 13 Jahren

Anders als manche andere Sprachen stellt C# keinen Kopierkonstruktor bereit. Wenn Sie ein neues Objekt erstellen und die Werte aus einem bestehenden Objekt kopieren möchten, müssen Sie die entsprechende Methode selbst schreiben.

Na ne Copy Methode schreibt man in etwa so:


class MyClass
{
    private int MyValue;

    public MyClass(int val)
    {
        MyValue = val;
    }

    public MyClass Copy()
    {
        return new MyClass(MyValue);
    }
}

Also die Copy Methode erstellt eine Instanz der eigenen Klasse mit aktuellen Werten ihrer Instanz und gibt die zurück.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo witte,

"später erneut aufrufe" heißt, ich lese Werte von einem anderen Datensatz ein und möchte, das die anderen Werte auch sofort in den Usercontrols dargestellt werden (in diesem Fall Checkboxen).

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo TThrebank,

Danke für den Code. Dieser Code erstellt mir aber leider eine neue Klasse, was ich eigentlich vermeiden wollte. Dann könnte ich auch mit _myClass=_myClass2 die Werte direkt zuweisen.


MyClass _myClass;
MyClass _myClass2;
_myClass2=(from .. in dataEntities... where... select ...).FirstOrDefault(); 
_myClass=_myClass2

Ich möchte aber eine Art á la _myClass2.CopyTo(_myClass), der nur alle Werte aus _myClass2 nach _myClass kopiert ohne das das komplette _myClass neu zugewiesen wird.

Damit würde sich mein oben beschriebenes Problem beseitigen:

Wenn ich hingegen die einzelnen Werte zuweise (z.B. _myClass.Feld1=_myClass.Feld1 und _myClass.Feld2=_myClass.Feld2 etc.) klappt es hingegen, das das gebundene Objekt richtig aktualisiert wird.

Zudem habe ich inzwischen ein weiteres Problem bemerkt: Sobald ich nicht nur die einzelnen Werte kopiere, sondern das komplette _myClass durch die Zuweisung "ersetzt" wird, verliert .NET auch meine mit += abonnierte Methode an _myClass.PropertyChanged.

Dies kann scheinbar nur mit einem solchen "Softcopy" behoben werden?

Vielen Dank

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

1.433 Beiträge seit 2006
vor 13 Jahren

Wenn du ein identisches Objekt brauchst, also 1 zu 1 Copy dann würde ich mal ICloneable anschauen.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo schaedld,

Danke für den Tipp! Ich hab´s versucht und implementiert. Jedoch nach wie vor das gleiche Problem.

Ich denke, dass es nicht geht, weil ich mir die Daten ja schon in ein neues Objekt selektiert habe (myClass):


myClass2=(from .. in dataEntities... where... select ...).FirstOrDefault();
// wenn ich dann sage:
myClass=myClass2.Clone()

...erstelle ich zwar einen 1:1 Clon, aber myClass ändert sich trotzdem. Daher ist etwas notwendig wie z.B. myClass=myClass2.DuplicateAllValues (was es ja nicht gibt) oder eine foreach-Funktion (die ja scheinbar nicht geht), die alle Werte aus myClass durchgeht und in myClass setzt.

Vieleicht gibt es noch ein paar Ideen?

Danke!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]