2009-07-21 3 views
0

Ich habe eine Bass-Klasse in LinqToSql, die 2 Unterklassen hat erstellt. Ich muss jedem der benutzerdefinierten Update-Methoden der Unterklassen eine andere gespeicherte Prozedur zuweisen. Dies ist in Ordnung, aber ich bekomme eine Fehlermeldung von "Ungültiger Objektname xxx '".Wie richten Sie benutzerdefinierte Methoden zum Einfügen/Aktualisieren/Löschen auf geerbte Unterklassen in LinqToSql ein?

z.B.

DataClasses1DataContext dc = new DataClasses1DataContext(); 
Class2 c2 = new Class2() { ID = 1, Name = "test", Type = "s" }; 
dc.Class1s.InsertOnSubmit(c2); 
dc.SubmitChanges(); 

... Class2 erbt Class1 und Class2 seine eigene benutzerdefinierte INSERT Methode hat (das ist, was ich es ausgeführt werden soll).

danke.

LÖSUNG: Bryan's Antwort gab mir, was ich suchte. Hier ist der Code, den ich hinter dem Designer die Klasse hinzugefügt:

partial class DataClasses1DataContext 
{ 
    partial void InsertClass1(Class1 instance) 
    { 
     instance.Insert(this); 
    } 
} 

partial class Class1 
{ 
    public abstract void Insert(DataClasses1DataContext dataContext); 
} 

partial class Class2 
{ 
    public override void Insert(DataClasses1DataContext dataContext) 
    { 
     dataContext.InsertSP(((System.Nullable<int>)(ID)), Name); 
    } 

} 

partial class Class3 
{ 
    public override void Insert(DataClasses1DataContext dataContext) 
    { 
     dataContext.InsertSP2((System.Nullable<int>)(ID), Name); 
    } 
} 

Die InsertSP und InsertSP2 gespeicherte Procs auf mit dem Designer gezogen wurde, mir die Mühe sparen von mit manuell sp nennen.

ALL CREDIT FÜR DIESE

Antwort

2
ONE

Bryan Wenn das ist, was durch die LINQ to SQL-Designer generiert wird:

partial void InsertClass1(Class1 instance); 

und Sie haben eine Implementierung in einer partial Klasse:

partial void InsertClass1(Class1 instance) 
{ 
    ...call stored procedure... 
} 

Sie könnten stattdessen eine virtuelle Methode in Class1 haben, um diese Operation darzustellen:

protected virtual void Insert(Class1 instance) 
{ 
    ...call stored procedure... 
} 

und nennen es von Class1 ‚s partial Methode:

partial void InsertClass1(Class1 instance) 
{ 
    Insert(instance); 
} 

und außer Kraft setzen es in Class2:

protected override void Insert(Class1 instance) 
{ 
    ...call different stored procedure... 
} 

Der einzige Haken ist, dass Sie Class2 in der Besetzung haben wird überschriebene Methode, aber es wird immer gelingen.

+0

Ich verweise auf den ORM-Designer und die Methoden insert/update/delete, mit denen Sie angeben können, welche sp ausgeführt werden soll, wenn SubmitChanges aufgerufen wird. Ich denke, was du sagst, ist, im Grunde den SubmitChanges-Ansatz aufzugeben und eigene Insert-Methoden zu schreiben. Ja, das ist in Ordnung, aber es vereitelt irgendwie den Zweck der Verwendung des ORM und bedeutet, dass ich meine eigenen Methoden beibehalten muss, anstatt es dem Auto-Generator-Ding zu überlassen. Was ich wirklich gehofft hatte, war, dass das Setzen der Einfügemethode im ORM auf eine Unterklasse die Heirachy korrekt anordnen würde, aber es sieht nicht so aus. Trotzdem danke. – HAdes

+0

Das habe ich eigentlich nicht gemeint. Der aufrufende Code mit InsertOnSubmit und SubmitChanges würde genau gleich bleiben. Ich schlage eine neue Methode in der Klasse1 vor, um die Begrenzung des Designers zu umgehen. Es wäre immer noch vollständig in den Entitäten gekapselt. Ich verstehe die Frustration darüber, nicht nur so zu arbeiten, wie du es hast. –

+0

Tut mir leid, ich glaube, ich habe meine eigenen Kabel gekreuzt. Ich habe deine Lösung noch einmal durchgeschaut und mit einem Mal genau verstanden, was du da bekommen hast klickte plötzlich. Also musste ich mich nicht auf den Designer verlassen, sondern nur die partielle Klasse von datacontext verwenden (wusste nicht, dass ich das auch tun könnte). Ich füge hinzu, was ich getan habe.Vielen Dank Bryan, sparte mir Speck, während ich dränge, dass wir künftig LinqToSql und LinqToEntities verwenden. – HAdes

Verwandte Themen