verwendetes Datenbanksystem: <EF 5>
Hallo zusammen,
ich möchte in meinem zentralen Repository, welches das EF gegen die Geschäftslogik kapselt, folgendes erreichen: Vor dem Aufruf der tatsächlichen SaveChanges() Methode vom DbContext, würde ich gerne die aufgetretenen Änderungen (Changes) die nun persistiert werden müssen durchlaufen um festzustellen, ob ggf. weitere Änderungen automatisch durch das Repository gemacht werden müssen.
Grund dafür ist, dass in meinem Fall in der Datenbank Werte-Paare vorhanden sind, also Spalten, die im Prinzip den selben Wert speichern nur in einem anderen Format. Nun möchte ich verhindern, dass nur ein Wertepaar angepasst und das andere vergessen wurde.
Dazu habe ich mal folgenden Algorithmus entwickelt:
// --- Ermittlung aller Änderungen die nun persistiert werden sollen ---
var changes = from e in this.Context.ChangeTracker.Entries()
where e.State != System.Data.EntityState.Unchanged
select e;
foreach (var change in changes)
{
var item = change.Cast<T>().Entity;
if (change.State == System.Data.EntityState.Modified)
{
var originalValues = this.Context.Entry(item).OriginalValues;
var currentValues = this.Context.Entry(item).CurrentValues;
foreach (string changedProperty in currentValues.PropertyNames)
{
PropertyInfo propertyInfo = this._properties.Find(pi => pi.Name == changedProperty);
// Check it is a value-pair-field
if (propertyInfo.PropertyType.Name.Contains("SPECIAL_CHAR"))
{
// Check if the pair was also edited
// First get the name of the pair field ...
string pairPropertyName = this._FindPropperUsualPropertyToUnicodeProperty(propertyInfo.PropertyType.Name);
// Check if the field was edited
if (currentValues.PropertyNames.First(pi => pi == pairPropertyName) == null)
{
// Not editied -> have to edited it here automatically
originalValues[pairPropertyName] = currentValues[changedProperty]; // I KNOW -> cannot work like this ...
}
}
}
}
}
// SaveChanges() hier dann aufrufen ...
Mir ist bewusst, dass folgende Zeile nicht funktionieren kann:
originalValues[pairPropertyName] = currentValues[changedProperty]; // I KNOW -> cannot work like this ...
Aber welche Möglichkeit habe ich hier?
Reicht da nicht ein Post?
>
Gut erkannt. Ich wüsste jedoch nicht, dass dies untersagt ist 8o
Ja, tatsächlich habe ich auch dort gefragt und bisher keine Rückmeldung bekommen. Deswegen wollte ich meine Chancen erhöhen und die Frage in einem deutschsprachigen Forum, dass zunächst mit Stackoverflow nichts zutun hat, posten.
Geschlossen wegen Crosspost. [Hinweis] Wie poste ich richtig?
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck