2009-07-16 4 views
1

hier ist, was ich tue, und nicht für mich arbeiten.N Tiers mit SubSonic 3, Schmutzige Spalten Sammlung ist immer leer auf Update

Ich habe eine DAL mit SubSonic 3 ActiveRecord Vorlage generiert, ich habe eine Service-Schicht (Business-Schicht, wenn Sie gut), die Mischung von Fassade und einige Validierung haben.

sagen, ich habe eine Methode auf der Service-Schicht wie öffentliche void UpdateClient (Client-Client); in meiner GUI ich ein Client-Objekt erstellen füllen Sie es mit einigen Daten mit ID und übergeben Sie es an die Service-Methode, und dies hat nie funktioniert, die Sammlung schmutziger Spalten (die verfolgen, welche Spalten geändert werden, um wirksamere Update-Anweisung zu verwenden) ist immer leer.

Wenn ich versuchte, das Objekt aus der Datenbank innerhalb meiner GUI zu bekommen, dann übergeben Sie es an die Service-Methode, es funktioniert auch nicht.

Das einzige Szenario, das ich finde funktioniert, wenn ich das Objekt aus der Datenbank abfragen und Update() auf den gleichen Kontext alle innerhalb meiner GUI aufrufen und dies die gesamte Service-Schicht, die ich erstellt habe, besiegt.

aber zum Einfügen und Löschen alles funktioniert gut, ich frage mich, ob dies etwas mit Objektverfolgung tun muss, aber was ich weiß, ist SubSonic nicht tun.

bitte beraten. danke. Adel.

+0

Was Sie GUI-Schicht (WinForms/XAML/Webforms/mvc)? –

Antwort

2

Es scheint eine Funktion und kein Fehler zu sein. Subsonic markiert eine Spalte nur dann als Dirty, wenn das Objekt aus der DB geladen wird. Sie können also nicht wirklich Objekte speichern und ablegen, Änderungen an ihren Eigenschaften hinzufügen und sie dann erneut speichern. Stelle dir das vor.

Sehen Sie, wie die Elementvariable _isLoaded falsch ist, es sei denn, das Objekt wird wirklich aus DB geladen. Subsonic fügt meine Eigenschaft nie der Liste der schmutzigen Spalten hinzu.

Ihr Repository Save() Methode würde in etwa so aussehen:

public MyObject Save(Myobject myObject) 
{ 
    myObject.Save(); 
    myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id); 
    return myObject; 
} 
1

Statt:

public MyObject Save(Myobject myObject) 
{ 
    myObject.Save(); 
    myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id); 
    return myObject; 
} 

Sie tun können:

myObject.SetIsLoaded(true); 

Das spart zu haben Fragen Sie den Datenbankserver erneut ab.

Zum Beispiel:

myObject.Save(); 
myObject.Name ="Something else"; 
myObject.SetIsLoaded(true); 
myObject.Save();