Persistants provenant des attributs


Un petit exemple de faire de la dérivée attributs qui sont conservées dans la base de données.
Persistants provenant des attributs en Gras
Gras est dérivé attributs sont toujours évaluées en mémoire, ce qui rend impossible d'effectuer une InPS (persistance de stockage) de recherche à l'encontre de certaines données. Toute recherche de l'expression qui fait référence à un attribut dérivé sera la cause de Gras pour charger tous les objets de la base de données en mémoire pour une évaluation de la mémoire, cela peut être très lent et consommer beaucoup de ressources.
les Dernières discussions ont été publiés sur les groupes de soutien se demander comment atteindre dérivé des attributs qui sont également conservées à la DB pour SQL évaluation. Aujourd'hui, j'ai eu la même exigence, et c'est la solution que j'ai trouvé.
La première chose à faire est d'éviter le marquage de l'attribut dérivé du modèle. Au lieu de cela, faire de l'attribut persistant d'attribut, par exemple
& nbsp & nbsp FullName: chaîne de caractères (128)
La prochaine étape est de s'assurer que la valeur de FullName est toujours à jour, nous avons donc besoin de remplacer ReceiveEventFromOwned dans chaque classe descendante nous créer.


procédure TPerson.ReceiveEventFromOwned((Initiateur: TObject OriginalEvent: TBoldEvent)
démarrer
& nbsp & nbsp hérité
& nbsp & nbsp si (OriginalEvent = beCompleteModify) et (Auteur = M_Name)
& ! & ! & ! & nbsp FullName := M_FirstName.AsString '' M_LastName.AsString
fin


Cela permettra d'assurer que l'attribut est toujours à jour, mais la faiblesse ici, que nous allons maintenant aborder, c'est qu'il est possible de modifier FullName manuellement. Pour résoudre ce problème, nous avons besoin de faire FullName en lecture seule, comme


fonction TPerson.ReceiveQueryFromOwned(Auteur: TObject OriginalEvent: TBoldEvent const Args: array de const Abonné: TBoldSubscriber): Boolean
démarrer
& nbsp & nbsp Résultat := hérité ReceiveQueryFromOwned(Initiateur, OriginalEvent, Args, l'Abonné)
& nbsp & nbsp sinon ou BoldObjectIsDeleted Quitter
& nbsp & nbsp si (Auteur = M_FullName) et (OriginalEvent = bqMayModify)
& nbsp & nbsp démarrer
& ! & ! & ! & nbsp Result := False
& ! & ! & ! & nbsp //erreur Inattendue
& ! & ! & ! & nbsp SetBoldLastFailureReason(TBoldFailureReason.Create('FullName est immuable', Self))
& nbsp & nbsp fin
fin


FullName ne peuvent plus être modifiés, malheureusement l'erreur que nous avons introduit est que nous ne pouvons plus définir la valeur de FullName dans notre dérivation de code.
Pour résoudre ce dernier problème, nous avons besoin d'un moyen d'identification de l'utilisateur/normal-les changements de code et 'interne' des changements. Pour ce faire, j'ai toujours mettre en œuvre un modèle commun à mon objet de base, comme
1) Créer un Delphi attribut - InternalChangeCount: Integer
2) Ajouter une méthode protégée BeginInternalChange
3) Ajouter une méthode protégée EndInternalChange
4) Ajouter une méthode protégée IsInternalChange: Boolean


//Remarque: TRootObject est l'objet racine de mon modèle
procédure TRootObject.BeginInternalChange
démarrer

& nbsp & nbsp Inc(fInternalChangeCount)
fin
procédure TRootObject.EndInternalChange
démarrer
& nbsp & nbsp si fInternalChangeCount = 0
& ! & ! & ! & nbsp augmenter Exception.Create('EndInternalChange sans BeginInternalChange')
& nbsp & nbsp Dec(fInternalChangeCount)
fin
fonction TRootObject.IsInternalChange: Boolean
démarrer
& nbsp & nbsp Result := (InternalChangeCount > 0)
fin


Enfin, nous avons juste besoin de mettre à jour le code source d'origine, de sorte que
1) Définition de la dérivée de code se fait à l'intérieur d'un 'changement interne'
2) des Modifications FullName sont autorisées que si le changement est l'une interne.


procédure TPerson.ReceiveEventFromOwned(Auteur: TObject OriginalEvent: TBoldEvent)
démarrer
& nbsp & nbsp hérité
& nbsp & nbsp si OriginalEvent = beCompleteModify
& nbsp & nbsp démarrer
& ! & ! & ! & nbsp si (Auteur = M_FirstName) ou (Auteur = M_LastName)
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp BeginInternalChange
& ! & ! & ! & ! & ! & nbsp FullName := M_FirstName.AsString '' M_LastName.AsString
& ! & ! & ! & nbsp enfin
& ! & ! & ! & ! & ! & nbsp EndInternalChange
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin
fonction TPerson.ReceiveQueryFromOwned(Auteur: TObject OriginalEvent: TBoldEvent const Args: array de const Abonné: TBoldSubscriber): Boolean
démarrer
& nbsp & nbsp Résultat := hérité ReceiveQueryFromOwned(Initiateur, OriginalEvent, Args, l'Abonné)
& nbsp & nbsp sinon ou BoldObjectIsDeleted Quitter
& nbsp & nbsp si (Auteur = M_FullName) et (OriginalEvent = bqMayModify)
& nbsp & nbsp démarrer
& ! & ! & ! & nbsp si IsInternalChange
& ! & ! & ! & ! & ! & nbsp Résultat := True
& ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & nbsp Résultat := False
& ! & ! & ! & nbsp //erreur Inattendue
& ! & ! & ! & nbsp sinon
& ! & ! & ! & ! & ! & nbsp SetBoldLastFailureReason(TBoldFailureReason.Create('FullName est immuable', Self))
& nbsp & nbsp fin
fin


Dans l'application que je suis de la création de la structure de l'objet est en fait comme suit:
& nbsp & nbsp RootObject (ModelRoot)
& ! & ! & ! & nbsp RoledObject (A une FullName)
& ! & ! & ! & ! & ! & nbsp Personne (FullName = FirstName '' LastName)
& ! & ! & ! & ! & ! & nbsp Département (FullName = Nom)
& ! & ! & ! & ! & ! & nbsp Société (FullName = Nom)
Conclusion:
Cette technique ne nécessite qu'un petit morceau de code pour chaque classe descendante (RecevieEventFromOwned) tout en offrant la possibilité d'effectuer des recherches sur le serveur de base de données à l'encontre d'un attribut dérivé. J'ai l'impression que les avantages l'emportent largement sur la petite quantité de travail nécessaire pour les obtenir.









Persistants provenant des attributs


Persistants provenant des attributs : Plusieurs milliers de conseils pour vous faciliter la vie.


Un petit exemple de faire de la derivee attributs qui sont conservees dans la base de donnees.
Persistants provenant des attributs en Gras
Gras est derive attributs sont toujours evaluees en memoire, ce qui rend impossible d'effectuer une InPS (persistance de stockage) de recherche a l'encontre de certaines donnees. Toute recherche de l'expression qui fait reference a un attribut derive sera la cause de Gras pour charger tous les objets de la base de donnees en memoire pour une evaluation de la memoire, cela peut etre tres lent et consommer beaucoup de ressources.
les Dernieres discussions ont ete publies sur les groupes de soutien se demander comment atteindre derive des attributs qui sont egalement conservees a la DB pour SQL evaluation. Aujourd'hui, j'ai eu la meme exigence, et c'est la solution que j'ai trouve.
La premiere chose a faire est d'eviter le marquage de l'attribut derive du modele. Au lieu de cela, faire de l'attribut persistant d'attribut, par exemple
& nbsp & nbsp FullName: chaîne de caracteres (128)
La prochaine etape est de s'assurer que la valeur de FullName est toujours a jour, nous avons donc besoin de remplacer ReceiveEventFromOwned dans chaque classe descendante nous creer.


procedure TPerson.ReceiveEventFromOwned((Initiateur: TObject OriginalEvent: TBoldEvent)
demarrer
& nbsp & nbsp herite
& nbsp & nbsp si (OriginalEvent = beCompleteModify) et (Auteur = M_Name)
& ! & ! & ! & nbsp FullName := M_FirstName.AsString '' M_LastName.AsString
fin


Cela permettra d'assurer que l'attribut est toujours a jour, mais la faiblesse ici, que nous allons maintenant aborder, c'est qu'il est possible de modifier FullName manuellement. Pour resoudre ce probleme, nous avons besoin de faire FullName en lecture seule, comme


fonction TPerson.ReceiveQueryFromOwned(Auteur: TObject OriginalEvent: TBoldEvent const Args: array de const Abonne: TBoldSubscriber): Boolean
demarrer
& nbsp & nbsp Resultat := herite ReceiveQueryFromOwned(Initiateur, OriginalEvent, Args, l'Abonne)
& nbsp & nbsp sinon ou BoldObjectIsDeleted Quitter
& nbsp & nbsp si (Auteur = M_FullName) et (OriginalEvent = bqMayModify)
& nbsp & nbsp demarrer
& ! & ! & ! & nbsp Result := False
& ! & ! & ! & nbsp //erreur Inattendue
& ! & ! & ! & nbsp SetBoldLastFailureReason(TBoldFailureReason.Create('FullName est immuable', Self))
& nbsp & nbsp fin
fin


FullName ne peuvent plus etre modifies, malheureusement l'erreur que nous avons introduit est que nous ne pouvons plus definir la valeur de FullName dans notre derivation de code.
Pour resoudre ce dernier probleme, nous avons besoin d'un moyen d'identification de l'utilisateur/normal-les changements de code et 'interne' des changements. Pour ce faire, j'ai toujours mettre en œuvre un modele commun a mon objet de base, comme
1) Creer un Delphi attribut - InternalChangeCount: Integer
2) Ajouter une methode protegee BeginInternalChange
3) Ajouter une methode protegee EndInternalChange
4) Ajouter une methode protegee IsInternalChange: Boolean


//Remarque: TRootObject est l'objet racine de mon modele
procedure TRootObject.BeginInternalChange
demarrer

& nbsp & nbsp Inc(fInternalChangeCount)
fin
procedure TRootObject.EndInternalChange
demarrer
& nbsp & nbsp si fInternalChangeCount = 0
& ! & ! & ! & nbsp augmenter Exception.Create('EndInternalChange sans BeginInternalChange')
& nbsp & nbsp Dec(fInternalChangeCount)
fin
fonction TRootObject.IsInternalChange: Boolean
demarrer
& nbsp & nbsp Result := (InternalChangeCount > 0)
fin


Enfin, nous avons juste besoin de mettre a jour le code source d'origine, de sorte que
1) Definition de la derivee de code se fait a l'interieur d'un 'changement interne'
2) des Modifications FullName sont autorisees que si le changement est l'une interne.


procedure TPerson.ReceiveEventFromOwned(Auteur: TObject OriginalEvent: TBoldEvent)
demarrer
& nbsp & nbsp herite
& nbsp & nbsp si OriginalEvent = beCompleteModify
& nbsp & nbsp demarrer
& ! & ! & ! & nbsp si (Auteur = M_FirstName) ou (Auteur = M_LastName)
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp BeginInternalChange
& ! & ! & ! & ! & ! & nbsp FullName := M_FirstName.AsString '' M_LastName.AsString
& ! & ! & ! & nbsp enfin
& ! & ! & ! & ! & ! & nbsp EndInternalChange
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin
fonction TPerson.ReceiveQueryFromOwned(Auteur: TObject OriginalEvent: TBoldEvent const Args: array de const Abonne: TBoldSubscriber): Boolean
demarrer
& nbsp & nbsp Resultat := herite ReceiveQueryFromOwned(Initiateur, OriginalEvent, Args, l'Abonne)
& nbsp & nbsp sinon ou BoldObjectIsDeleted Quitter
& nbsp & nbsp si (Auteur = M_FullName) et (OriginalEvent = bqMayModify)
& nbsp & nbsp demarrer
& ! & ! & ! & nbsp si IsInternalChange
& ! & ! & ! & ! & ! & nbsp Resultat := True
& ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & nbsp Resultat := False
& ! & ! & ! & nbsp //erreur Inattendue
& ! & ! & ! & nbsp sinon
& ! & ! & ! & ! & ! & nbsp SetBoldLastFailureReason(TBoldFailureReason.Create('FullName est immuable', Self))
& nbsp & nbsp fin
fin


Dans l'application que je suis de la creation de la structure de l'objet est en fait comme suit:
& nbsp & nbsp RootObject (ModelRoot)
& ! & ! & ! & nbsp RoledObject (A une FullName)
& ! & ! & ! & ! & ! & nbsp Personne (FullName = FirstName '' LastName)
& ! & ! & ! & ! & ! & nbsp Departement (FullName = Nom)
& ! & ! & ! & ! & ! & nbsp Societe (FullName = Nom)
Conclusion:
Cette technique ne necessite qu'un petit morceau de code pour chaque classe descendante (RecevieEventFromOwned) tout en offrant la possibilite d'effectuer des recherches sur le serveur de base de donnees a l'encontre d'un attribut derive. J'ai l'impression que les avantages l'emportent largement sur la petite quantite de travail necessaire pour les obtenir.


Persistants provenant des attributs

Persistants provenant des attributs : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation