Laden...

[erledigt] Entity Framework, WPF-Combobox und ConstraintException

Erstellt von m.grauber vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.342 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 12 Jahren
[erledigt] Entity Framework, WPF-Combobox und ConstraintException

verwendetes Datenbanksystem: <SQL-Server 2005, 2008>

Hallo,

beiße mich gerade an einem Problem aus, welches bereits tausendmal auch hier im Forum angesprochen wurde, scheinbar auch gelöst wurde, aber niemals gepostet wurde:

Immer wieder Databinding und Relations
ConstraintException
XML in Datenbank
Seltsames verhalten

Eine WPF-Combobox ist gebunden. Der Inhalt (ObservableCollection, die die Auswahldaten enthält) wird geändert beim Laden und teilweise auch wenn im Fenster bestimmte Aktionen gemacht wird.

Im Hintergrund wird mit dem Entity Framework gearbeitet.

In der Datenbank ist das zugehörige Feld vom Typ "not null".

Da während des Ladens anfänglich teilweise noch keine Daten geladen wurden, ist das Combo scheinbar kurzfristig null und will dies scheinbar störrisch in das gebundene Feld schreiben. Da dieses null durch die Regeln nicht in die Entität geschrieben werden können, erscheint beim Start immer folgender Fehler:

Fehlermeldung:
System.Data.ConstraintException: Diese Eigenschaft kann nicht auf einen NULL-Wert festgelegt werden.
InnerException=null
Source System.Data.Entity
StackTrace:bei System.Data.Objects.DataClasses.StructuralObject.SetValidValue(String value, Boolean isNullable)
bei MyProgram.MyClass.set_MyText(String value)

Problem ist, dass dieser Fehler hier auftritt:


[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.String MyText

...
	_MyText = StructuralObject.SetValidValue(value, false);
...

Da dieser Code vom Entity Framework automatisch erzeugt wurde (und das Datenbankmodell von Zeit zu Zeit immer wieder einmal neu generiert wird) kann ich diesen Code ja nicht einfach ändern.

Vorgabe ist aber, dass in der Datenbank das Feld "not null" sein muss.

Wie kann ich die Fehlermeldung verhindern? Sie tritt nicht an einer bestimmten Stelle in meinem C# Code auf, sondern scheinbar im WPF-Form zu teils unterschiedlichen Zeiten. Ich kann den Fehler daher nicht abfangen.

this.dataSet1.EnforceConstraints = false; kann ich nicht verwenden, da ich nicht wüsste, wie dies beim Entity Framework funktionieren sollte.

Nun bin ich wirklich ratlos. 🙁

Kann mir da wirklich niemand helfen? X(

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 12 Jahren

Hallo Profis,

hat denn wirklich niemand eine Idee dazu? X(

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 :]

C
80 Beiträge seit 2010
vor 12 Jahren

Hallo m.grauber,

ich weiß jetzt nicht genau wie dein Code aussieht, aber so wie ich dich verstehe, ist ein Wert der ObservableCollection null. Hast du vielleicht in Erwägung gezogen eine Art ViewModel-Klasse zu schreiben, die die ObservableCollection als Property definiert und bei der du in den set und get Accessors expizit die Collection und deren Inhalte auf Ungültigkeiten prüfen und diese beheben lassen kannst, bevor sie schlussendlich dem Entity und damit der DB zugewiesen wird.

Ein anderer Ansatz wäre es sogenannte Selftracking Entities zu verwenden.
Standardmäßig wird die Änderung für die Entity immer mitverwaltet. Mit Selftracking Entities kannst du das Verhalten abschalten. So kannst du zunächst das Entity ohne Verwaltung durch den DB Context bearbeiten und musst dich dann aber selbst um alles kümmern.

Die dritte Möglichkeit die mir einfällt, ist das Verhalten deines Bindings zu ändern. Eventuell kannst du das Binding im Sinne der Wertänderung selbst definieren, d.h. du sagst dem Binding explizit, wann es sich aktualisieren soll. dafür gibt es spezielle Methoden auf dem Binding Objekt.

Generell solltest du vielleicht den Stück Code für die Combobox sowie für die Definition des Bindings und wo der Fehler auftritt posten, damit man das Problem schneller findet.

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

Hallo CSharperUser,

vielen Dank, das Du mir geholfen hast und gleich mehrere Lösungsansätze gegeben hast! 👍

Ich habe seit gestern an anderen "Baustellen" gearbeitet, weil ich dabei nicht mehr weitergekommen bin.

Aus unerklärlichen Gründen 🙂 tritt der Fehler nun derzeit nicht mehr auf. Scheinbar wurde dadurch die Initialisierungsdauer und Abfolge evtl. geändert. Das ist für mich natürlich auch keine perfekte Lösung, weil der Fehler dann schlimmstenfalls sporadisch beim Kunden auftreten könnte.

Eventuell kannst du das Binding im Sinne der Wertänderung selbst definieren, d.h. du sagst dem Binding explizit, wann es sich aktualisieren soll.

--> Wenn dieses Problem nochmals auftritt, werde ich so vorgehen. Das ist in meinem Fall am einfachsten. Darauf bin ich gar nicht gekommen.

Vielen Dank nochmals!!! 🙂

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 :]