Toon posts:

[ALG] Entity in andere collection zetten

Pagina: 1
Acties:

Verwijderd

Topicstarter
We hebben 2 entities

Alliance
- Id
- Name
- Corporations
- AddCorporation

Corporation
- Id
- Alliance
- Name

Een alliance heeft meerdere corporations en een corporation weet ook in welke alliance die zit.

Ok, wat ik nu wil doen is mijn corporation in een andere alliance zetten, zonder data caching zou dit geen probleem zijn omdat na de refresh toch alle entities weer opnieuw worden opgehaald maar ik gebruik wel caching dus het volgende moet nu aangepast worden:

- De alliance in de corporation moet aangepast worden
- De collection van corporations in de oude alliance moet aangepast worden
- De collection van corporations in de nieuwe alliance moet aangepast worden

Wat is het beste om te doen? wat is de beste plek om de update method te plaatsen?

Zelf dacht ik om in de alliance entity de method "UpdateCorporation(Corporation, NewAlliance)" te maken maar ik weet niet zeker of dat wel de beste manier is in dit geval. Deze situatie komt een aantal keer voor in mijn applicatie daarom wil ik het graag in een keer goed doen.

[ Voor 1% gewijzigd door Creepy op 08-07-2007 00:58 . Reden: Duh..... ]


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Je wilt iets in de achterliggende dataset aanpassen en vervolgens diezelfde aanpassing in de cache ook doen? Dat is geen goed idee: daarmee creeer je, in geval van bugs, de mogelijkheid dat de cache andere data heeft dan de achterliggende dataset.

De gangbare oplossing voor dit probleem is om de cache te invalideren en de cache zichzelf te laten verversen.

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

Topicstarter
Daar heb je een heel goed punt daar had ik nog niet aan gedacht :)

De corporations collection in Alliance werkt met een lazy loading mechanisme, hij wordt alleen opgehaald als de collection null/nothing is.

Ik heb nu in alliance een method gemaakt die ik "ResetCorporations" genoemd heb, deze method zet de collection op null/nothing zodat wanneer hij weer nodig is opnieuw zal worden opgevraagd.
Omdat bij de corporation nu AllianceId veranderd wordt maak de ik de cache daarvoor leeg vlak voordat hij de tabel gaat updaten.

Code ziet er nu zo uit (VB)

Alliance property in corporation
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        Public Property Alliance() As Alliance
            Get
                If _Alliance Is Nothing And _AllianceId <> 0 Then
                    _Alliance = Registry.GetAllianceRepository.GetById(_AllianceId)
                End If
                Return _Alliance
            End Get
            Set(ByVal value As Alliance)
                _Alliance.ResetCorporations()
                value.ResetCorporations()

                _AllianceId = value.AllianceId
                _Alliance = value

                Registry.GetCorporationRepository.UpdateAlliance(Me)
            End Set
        End Property


Update method in repository
Visual Basic .NET:
1
2
3
4
5
6
7
8
        Public Sub UpdateAlliance(ByVal Corporation As Entities.Corporation) Implements ICorporationRepository.UpdateAlliance
            Cache.Remove(Corporation.CorporationId)

            Dim Command As New MySqlCommand("UPDATE Corporations SET AllianceId = ?AllianceId WHERE CorporationId = ?CorporationId")
            AddParamToCmd(Command, "?AllianceId", MySqlDbType.Int32, 0, Corporation.AllianceId)
            AddParamToCmd(Command, "?CorporationId", MySqlDbType.Int32, 0, Corporation.CorporationId)
            ExecuteNonQuery(Command)
        End Sub


Het enige wat me nog niet helemaal lekker zit is het stukje waar zowel de alliance zelf als het AllianceId in de corporation veranderd wordt.
Visual Basic .NET:
1
2
_AllianceId = value.AllianceId 
_Alliance = value 

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom maak je van (_)AllianceId geen echte property zodat deze altijd '_Alliance.AllianceId' terug geeft. (_)AllianceId wordt dan een soort van readonly 'virtuele' property.

Op die manier heb je nog maar 1 refentie naar de alliance. Of vergeet AllianceId helemaal. Wil je in de presentatie het AllianceId gebruiken dan zul je corp.Alliance.AllianceId (of nog beter alleen Id) moeten benaderen.

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
Dat doe ik niet omdat je dan een alliance object nodig hebt om een corporation object te maken, soms wil ik alleen een lijst met corporations en dan heb ik de alliance heel niet nodig. Deze manier leek mij beter qua performance.