9
votes

Comment puis-je mapper de Oracle UDTS avec ODP.NET sans utiliser OracleObjectMappeTribute?

La couche d'accès aux données de notre application va utiliser la fonctionnalité UDT de Oracle. Nous ne transmettrons que des objets UDT et depuis la base de données.

Pour le moment, nous générons les classes personnalisées à l'aide de la fonction fournie avec ODP.NET (qui crée une classe vraiment horrible que nous ne voulons vraiment pas dans notre codebase). p>

Nous utilisons ensuite une classe de mappage distincte, pour mapper la classe personnalisée à l'un de nos objets commerciaux (et de retour lorsque vous économisez). P>

J'essaie de trouver un meilleur manière de faire cela. P>

Je pensais que je voudrais juste faire des cours générées et écrire une classe de cartographie qui implémentait ioraclecustomType. Les méthodes de / toccustomobject feront ensuite de ma carte de mon UDT à mes objets métier. Cependant, cela m'a causé des problèmes quand je l'ai essayé - j'ai eu l'erreur "L'attribut d'objet n'est pas mappé sur un membre de type personnalisé". Il semble que, aussi bien les deux méthodes, j'ai également besoin d'attributs de ma classe de mappage - un attribut pour chaque élément de l'UDT. P>

Par exemple - Un flux de travail UDT contient trois éléments - un statut, une durée créée et créé par. Mon UDT est bien et simple: p> xxx pré>

tel quel objet je veux que cela se retrouve dans: p> xxx pré>

Je veux obtenir de l'un à l'autre sans avoir à ajouter du code Oracle à l'objet métier. P>

Donc, ma pensée était de créer une classe de mappage comme celle-ci: P>

    [OracleObjectMappingAttribute("STATUS")] public string a;
    [OracleObjectMappingAttribute("CREATED_BY")] public string b;
    [OracleObjectMappingAttribute("CREATED_DATETIME")] public DateTime c;


0 commentaires

3 Réponses :


2
votes

Qu'est-ce qui est si mauvais de ces attributs supplémentaires? Il existe déjà une quantité ginormeuse d'attributs dans les classes et les cadres .NET (par exemple WCF). ALTER LES ATTRACTUES ALLES DE PRÉCUIS LA MÊME COMME ALLIMING .NET .NET.

De toute façon, vous pouvez explorer les possibilités du fournisseur Oracle de Devart ( http: / /www.devart.com/dotconnect/oracle/ ). Ils ont aussi une version gratuite. Sa traçage avec UDTS est basé sur des chaînes non sur des attributs.


6 commentaires

Ce qui est mauvais, c'est qu'ils ne devraient pas être nécessaires. Les propriétés elles-mêmes ne sont jamais obtenues ou définies, la seule raison pour laquelle ils sont nécessaires est parce que chaque propriété UDT semble avoir besoin d'un de ces OracleObjectMappeTribute. Cela semble juste fou d'avoir un groupe de propriétés publiques dans une classe jamais utilisée (et oui, ils doivent également être publics!). Je suppose donc que c'est la nécessité pour les biens publics que je interrogee, plutôt que les attributs.


Oh, et merci pour l'autre lien Oracle Fournisseur (Malheureusement, cela ne m'aidera pas personnellement que lorsque je travaille, c'est seulement ODP.NET qui est utilisé)


Il y a en effet une "duplication" dans le code car vous devez cartographier le code et cartographier des attributs, mais je ne pense tout simplement pas que ce soit un gros problème. C'est un problème mais nog un gros.


Il semble juste fou que les propriétés avec des attributs ne sont jamais utilisées pour contenir des données. Ils sont juste assis là pour permettre à l'attribut de mappage d'exister.
ne semble-t-il pas un peu méchante pour vous?
J'ai posté sur les forums Oracle à ce sujet - je suis convaincu qu'il doit y avoir une meilleure façon Pour ce faire: forums.oracle.com/forums/...


Si vous suivez le principe de responsabilité unique au noyau, vous devez avoir une classe différente pour l'accès aux données et une classe différente pour la logique commerciale de toute façon. Cela signifie que vous devez développer des méthodes de mapper entre la classe d'accès aux données et la classe Logic Business. Si vous utilisez des méthodes de mapper entre un objet d'accès aux données et une classe de logique d'entreprise, vous n'avez pas besoin d'attributs Oracle sur vos classes BL. Vous voulez un raccourci, vous ne voulez pas une classe distincte indépendante pour l'accès aux données.


Vous dites donc que vous pensez que le niveau d'accès aux données doit renvoyer des objets contenant ces attributs (ce serait ma classe de mappage dans mon exemple ci-dessus), puis au niveau de l'entreprise, nous devrions convertir de ces objets dans nos objets métier? Personnellement, je pense que cela est un peu extrême en termes de séparation des responsabilités. Personnellement, je suis heureux de simplement conserver des bits d'accès aux données dans le niveau d'accès aux données. Je garde des objets métier dans une assemblée séparée au niveau de l'entreprise - de cette façon, ils peuvent être passés entre les niveaux heureux. Peut-être qu'ils pourraient être mieux nommés "entités".



0
votes

Vous pouvez définir votre BusinessObject en tant que membre privé et cartographier les attributs sur les propriétés respectives.

Bien que cela ne fournisse aucune fonctionnalité, au moins, ils fonctionnent correctement si utilisé.


0 commentaires

0
votes

Bienvenue à Oracle. Vous allez haïr ça ici. Vous avez raison, il est absolument ridicule que vous deviez fournir ces attributs lorsque vous devez explicitement obtenir / définir la valeur de toute façon. L'écosystème .NET est si merveilleusement générique (spécifiquement dans le noyau plus moderne .NET), que vous vous attendiez pleinement au cadre de gérer quelque chose comme celui-ci. Cependant, Oracle a complètement manqué ce mémo (comme ils le font souvent). La plupart des cadres Oracle (et toute la langue Java en général) ont ce problème. Voici ma solution de contournement:

Démarrer avec une classe de base UDT qui implémente ioraclecustomtype code> p> xxx pré>

La classe ci-dessus recherchera toutes les propriétés d'instance publique qui ont L'attribut OracleObjectMappeTtribute code> appliqué, puis obtenez / définir de manière dynamique la valeur. Votre UDT devient alors juste P>

public class Workflow : BaseUDT
{
    /// <summary>
    /// Gets the status of the workflow.
    /// </summary>
    /// <value>The status.</value>
    [OracleObjectMapping("STATUS")]
    public string Status { get; private set; }

    /// <summary>
    /// Gets the Windows Logon Id of the user performing the action
    /// </summary>
    [OracleObjectMapping("CREATED_BY")]
    public string CreatedBy{ get; private set; }
    /// <summary>
    /// Gets the time of the action 
    /// </summary>
    [OracleObjectMapping("CREATED_DATETIME")]
    public DateTime CreatedTime { get; private set; }
}


2 commentaires

peut-il être fait avec oracle.manageddataaccess.Client ?


Je suppose que ça! Je ne l'ai pas essayé moi-même.