0
votes

Framework entité - Insérez l'enregistrement d'une classe dans un autre objet "identique"

Utilisation de la base de données Première entité. Insertion d'enregistrements dans l'une de mes tables, aucun problème du tout. Ensuite, j'ai découvert sous certaines circonstances, je recevais des records en double, qui sont bien acceptables. Donc, mon plan de traiter avec celles-ci consistait à créer une table identique, à attraper l'exception, à mettre le double dans la table identique et à l'examiner à une étape ultérieure.

Cependant, je pensais naïvement comme ils étaient des tables identiques, je pouvais juste Insérez l'objet que j'ai déjà créé dans l'autre table "Erreur", qui, évidemment, je ne peux pas faire ("impossible de convertir de" original_class "en" New_class ""), que je comprends.

Il y a une meilleure façon de faire ce que j'essaie d'atteindre, ou existe-t-il un moyen simple de convertir mon "original_class" à mon "nouveau_class" car ils sont absolument identiques?

*** EDIT Pensé qu'il peut être bénéfique d'ajouter du code de clarté (pas mon code actuel, juste une représentation de ce que j'essaie d'atteindre)

ma classe de transaction xxx

ma classe d'erreur de transaction xxx

Comment j'essaie de traiter l'erreur xxx

Je viens de taper que sur La mouche, alors pardonnez toutes les fautes de frappe, je pense que vous avez l'idée.


0 commentaires

3 Réponses :


2
votes

Vous pouvez créer une méthode qui renvoie un nouvel objet comme: xxx pré>

alors simplement enregistrer l'objet d'erreur comme normal. p>

Si cela se produit sur plusieurs types que vous puissiez Fabriquez une méthode générique qui utilise la réflexion et passe par les propriétés d'origineObject, y propose des valeurs et les définit sur les propriétés ERROROBJECT avec le même nom. p>

Méthode générique (propriétés avec les mêmes noms doivent être de la MÊME TYPE): P>

    public static Tout CloneAndCast<Tin, Tout>(Tin source)
        where Tin : class
        where Tout : class, new()
    {
        if(source != null)
        {
            var clone = new Tout();

            IEnumerable<PropertyInfo> membersIn = typeof(Tin).GetProperties();
            PropertyInfo[] membersOut = typeof(Tout).GetProperties();

            foreach(PropertyInfo member in membersIn)
            {
                membersOut.FirstOrDefault(o => o.Name == member.Name)?.SetValue(clone, member.GetValue(source));
            }

            return clone;
        }
        else
        {
            return null;
        }
    }


2 commentaires

Salut @tomislav. OK, c'est définitivement une option, je me demandais simplement s'il y avait une méthode plus simple (je ne suis pas vraiment un programmeur, codez simplement pour obtenir!). Mon objet n'a que 6 attributs, de sorte qu'il ne serait donc pas trop onéreux pour prendre cet itinéraire.


À mon avis, toutes les autres options seraient plus compliquées. Si cela se produit plusieurs fois, une approche différente pourrait être meilleure, mais si c'est juste une fois que celui-ci est correct. Peut-être que quelqu'un d'autre a une solution plus simple.



1
votes

Je pense qu'un moyen décent de le faire serait de créer une classe de base avec toutes les propriétés

using(var db = new tranEntities())
{
    var t = new TranBaseClass();
    t.tranDescription = @"Some Description";
    try
    {
        db.Trans.Add(new Tran(t));
    }
    catch (System.Data.Entity.Infrastructure.DbUpdateException)
    {
        db.TransError.Add(new TranError(t));
    }
}


3 commentaires

Merci pour ce @sttackberg. Mon problème avec cette solution est que, comme j'utilise d'abord la base de données EF, si je dois mettre à jour mon modèle de la DB, cela sera écrasé :(


Il suffit d'essayer cela et d'où j'essaie de créer le constructeur pour Tran, c'est-à-dire I.E. Var Tran = New Tran (Tranbaseclass) I Obtenir "Tranbaseclass est un type, qui n'est pas valable dans le contexte donné"


@ Skinnypete63 Vous devrez passer une instance de tranbaseclass à condition de la classe elle-même. Tran public (Tranbaseclass Tranbaseclass) {// Définir les propriétés}, puis vous pouvez utiliser: Var T = Nouveau Tranbaseclass (); t.trandescription = @ "une description"; Var Tran = Nouveau Tran (T);



2
votes

Une alternative à la réponse de Tomislav, si votre projet utilise JSON, vous pouvez basculer des types identiques à l'aide de la sérialisation JSON:

var tran = new Tran { TranDescription = "Some description." };

// do stuff...

var tranError = tran.Swap<Tran, TranError>();


2 commentaires

Merci pour la réponse, comme votre pensée. Cependant, je suis un homme AF petit cerveau et non un développeur, je viens de coder pour obtenir, alors je vais pour la réponse la plus simpliste!


J'ai également pensé à héritage sur les classes de copier (que vous pouvez également utiliser à l'aide de MOWORAPPER). @ Skinnypete63 Héritage est possible avec EF DB en premier. Il y a quelques façons différentes de la réaliser aussi mais de vérifier cet exemple: Stackoverflow.com/a/22263190/263832