2009-07-27 3 views
1

Ich habe dynamische DataWebsite, die eine SQL SP verwendet, um die Operationen zu aktualisieren .. Ich habe ein Problem hier, meine Löschfunktion ist auch ein Update (Einstellung IsDeleted = 1) Operationen. Ich verwende derzeit LINQ Abfrage und Aufruf datacontext.SubmitChanges() zum Löschen. Das Problem besteht darin, dass die LINQ-Aktualisierungsabfrage (die IsDeleted = 1 setzt) ​​beim Aufruf von SubmitChanges() ebenfalls das Update-SP aufruft, das nur für Aktualisierungsvorgänge gedacht ist. Gibt es eine Möglichkeit, meine LINQ-Abfrage direkt an die DB auszulösen, anstatt Update SP aufzurufen?LINQ Hilfe für dynamische Daten Website

Der obige Code ruft immer UpdateSP auf, das für den Aktualisierungsvorgang konfiguriert ist.

+0

könnten Sie Ihren Code für uns posten, damit wir Ihnen helfen können> – StevenMcD

+0

Soft-Löschungen sind ein viel schwierigeres Design, als sie Kredit gegeben werden: http://weblogs.asp.net/fbouma/archive/2009/02 /19/soft-deletes-are-bad-m-kay.aspx –

Antwort

0

Ich bin nicht 100% sicher, dass ich der Idee hier folgen.

im Allgemeinen um den Datensatz zu löschen, die Sie würde sagen:

_dataContext.Employee.remove(ild); 
_dataContext.Submitchanges(); 

Aber es scheint, als ob Sie den Datensatz nur aktualisieren wollten jede Enployee zu lesen, die eine Einstellung IsDeleted = 1 als gelöschten Datensatz hat. Wenn Sie den Code ausführen, den Sie aktuell haben, generieren Sie eine UPDATE-Anweisung, und der UpdateSP wird ausgelöst.

Gibt es einen Grund, warum Sie die .remove() -Methode nicht verwenden und den Eintrag ophysikalisch löschen können?

+0

Es war eine geschäftliche Anforderung, eine Reihe nicht physisch zu löschen –

+0

Ah ok dann, in diesem Fall ist meine Antwort nutzlos. Das tut mir leid! – StevenMcD

1

In diesem Fall könnten Sie einen gelöschten gespeicherten proc verwenden, der genauso wie Ihr Update-Prozess aufgerufen wird. Die Lösch proc muss nicht tatsächlich eine FROM Tabellenabfrage durchführen DELETE, sondern könnte ein Update auf der zugrunde liegenden Tabelle tun, um die IsDeleted Flagge als entsprechende Einstellung:

CREATE PROCEDURE 
    @Id int 
AS 
    UPDATE dbo.Employee 
    SET IsDeleted = 1 
    WHERE Id = @Id 

würden Sie dann diese Funktion auf das Löschverhalten Karte in LINQ to SQL, so wie Sie die Update-Methode durchgeführt haben. Mit dieser Option würde Ihre Kundennummer ein einfaches Entfernen auf dem Tisch tun und nicht mit der IsDeleted Flagge zu tun:

_dataContext.Employee.Remove(ild); 
_dataContext.SubmitChanges(); 

In Ihrem Modell, würde ich argumentieren, dass Sie gar nicht aussetzen sollten IsDeleted. Das ist ein Datenbankimplementierungsdetail. Wenn Sie weiche Löschvorgänge verwenden, sollten Sie Ihre physische Tabelle abstrahieren und die Funktionalität durch Sichten oder Tabellenwertfunktionen verfügbar machen.

Als Alternative zu der Option für das Löschen können Sie auch eine Tombstone-Tabelle in Betracht ziehen, die Ihre Transaktionstabelle nachahmt. Verwenden Sie bei einer Löschoperation einen gespeicherten Prozess oder Trigger, um den Datensatz aus der Transaktionstabelle in die Tombstonetabelle zu verschieben. Damit können Sie das IsDeleted-Flag aus der Datenbank entfernen und die Notwendigkeit beseitigen, die Filterung für alle Zugriffe (einschließlich Berichte) einzuschließen.

+0

So sehe ich auch das Problem. AKTUALISIEREN Sie die Spalte isDeleted und fahren Sie fort. –