LINQ-Update im Business layer

09/12/2009 - 23:33 von Thomas Ehlert | Report spam
Hi beisammen!

Ich stricke (immer noch) an einer Website in ASP.NET.
Nach einigen Ratschlàgen die ich mir hier geholt habe,
habe ich die (Datenbank)-Anwendung in 3 Layer aufgeteilt.

Der Datenlayer làuft per LINQtoSQL. Im Frontend hole ich mir
also einen Datensatz über den B(uisiness)L(ayer) der ein Record
als "IEnumerable(Of DataObjects.ActivityDetails)" zurückgibt.

Wobei "DataObjects" der LINQ-Datenlayer ist.

Da fàngt es schon einmal an zu stören. Ich gebe eine Liste zurück,
in der immer nur ein Datensatz existieren kann. Ich habe aber keine
Idee, was ich dort sonst übergeben könnte...

Die Bindung (Frontend) làuft dann in etwa so:

Private Sub BindDetailFields(ByVal detailID As Guid)
Dim bl As New ActivitiesReport.BusinessLayer.Activities
Dim tb As DataObjects.ActivityDetails = bl.GetDetail(detailID)(0)
hfTaetigkeitsdetailID.Value = tb.TaetigkeitsdetailID.ToString
txtEditDate.Text = tb.Arbeitstag
...

Per Code wird das Ganze also in ein paar Textfelder geschrieben,

Beim klick auf den Button "Save" der dort auch noch existiert, wird
dann eine recht umfangreiche Eingabevalidierung vorgenommen. Dazu
hole ich die Textfeldinhalte wiederum in ein "Of
DataObjects.ActivityDetails"
hinein:

Private Sub UpdateRecord()
Dim bl As New BusinessLayer.Activities
Dim tb As New DataObjects.ActivityDetails
tb.Arbeitstag = CDate(txtEditDate.Text)
tb.Ergaenzung = txtEditComment.Text
...

'Update auf BL absetzen
BL.UpdateDetail(tb as DataObjects.ActivityDetails).


Nun wird in der Updateroutine des BL das selbe Spielchen
wiederholt:

Public Sub UpdateDetail(ByVal tb As DataObjects.ActivityDetails)
Dim c As New DataLayer.Activities
Dim lst As IEnumerable(Of DataObjects.ActivityDetails)
lst = From p In c.ActivityDetails _
Where p.TaetigkeitsdetailID = tb.TaetigkeitsdetailID _
Select p

lst(0).Arbeitstag = tb.Arbeitstag
...
c.SummitChanges


Das klappt soweit einwandfrei, kommt mir aber reichlich merkwürdig vor.
Zwei mal identische Roundtrips, dann den Datensatz überschreiben
und schließlich updaten, scheint etwas zuviel Arbeit für einen Datensatz?!?

Oder habe ich bei der Schichtentrennung mal wieder was falsch verstanden?

Viele Grüße und TIA
Thomas

P.S. Sorry für den Haufen Text...
 

Lesen sie die antworten

#1 Gerold Mittelstädt
10/12/2009 - 00:46 | Warnen spam
Hallo,

Thomas Ehlert schrieb:
Der Datenlayer làuft per LINQtoSQL. Im Frontend hole ich mir
also einen Datensatz über den B(uisiness)L(ayer) der ein Record
als "IEnumerable(Of DataObjects.ActivityDetails)" zurückgibt.



Warum nicht einfach als "ActivityDetail"?

Wobei "DataObjects" der LINQ-Datenlayer ist.

Da fàngt es schon einmal an zu stören. Ich gebe eine Liste zurück,
in der immer nur ein Datensatz existieren kann. Ich habe aber keine
Idee, was ich dort sonst übergeben könnte...



Return <Abfrage>.Single[OrDefault]()

Per Code wird das Ganze also in ein paar Textfelder geschrieben,

Beim klick auf den Button "Save" der dort auch noch existiert, wird
dann eine recht umfangreiche Eingabevalidierung vorgenommen. Dazu
hole ich die Textfeldinhalte wiederum in ein "Of
DataObjects.ActivityDetails"
hinein:

Private Sub UpdateRecord()
Dim bl As New BusinessLayer.Activities
Dim tb As New DataObjects.ActivityDetails
tb.Arbeitstag = CDate(txtEditDate.Text)
tb.Ergaenzung = txtEditComment.Text
...

'Update auf BL absetzen
BL.UpdateDetail(tb as DataObjects.ActivityDetails).


Nun wird in der Updateroutine des BL das selbe Spielchen
wiederholt:

Public Sub UpdateDetail(ByVal tb As DataObjects.ActivityDetails)
Dim c As New DataLayer.Activities
Dim lst As IEnumerable(Of DataObjects.ActivityDetails)
lst = From p In c.ActivityDetails _
Where p.TaetigkeitsdetailID = tb.TaetigkeitsdetailID _
Select p

lst(0).Arbeitstag = tb.Arbeitstag
...
c.SummitChanges


Das klappt soweit einwandfrei, kommt mir aber reichlich merkwürdig vor.



Jo.. isses auch n bisschen :)
Einerseits würd ich die Datenhaltende Klasse nur einzeln und nicht in
einer Aufzàhlung übergeben, und rückwàrts funktionierts dann natürlich
genauso.

Schau Dir mal Table(Tentity).Attach(TEntity, Boolean) an. Damit wird ein
bereits vorhandener Datensatz, der "abgekoppelt" wurde, einfach mit
Deinem neuen überschrieben (sofern die Identitàtswerte die selben sind).
Hab gerade leider keinen Code zur Hand, kann aber was nachreichen, wenn
Dus benötigst.

Rauslaufen wird das jedenfalls im DataContext auf (pseudocode):

Public Sub GetDetail(..) As ActivityDetail
Return Activities.Where(..).Single()
End Sub

Public Sub UpdateDetail(Detail As ActivityDetail)
Activities.Attach(Detail, True)
Activities.SubmitChanges()
End Sub


Viele Grüße!

Ähnliche fragen