51 votes

Clonage de données sur Entity Framework

Je suis un logiciel de création où l'utilisateur peut créer de nouveaux produits basés sur les produits plus anciens.

Maintenant, j'ai besoin de faire un copier / clonage des opérations avec Entity Framework. J'ai d'abord commencé à écrire comme ceci:

foreach(sourcedata1 dans la table1)
{
 ... créer un nouveau tableau
 ... de copier des données
 ... créer un Guid
 ... ajouter
 foreach(sourcedata2 dans table2)
{
 ... créer un nouveau tableau
 ... de copier des données
 ... créer un Guid
 ... ajouter 

 ... et ainsi de suite
}
}

Le problème est que ce n'est pas une belle façon de le faire. Est-il un moyen facile clone de l'information (à l'exception de Guid qui doit être générés pour les nouvelles lignes) ou dois-je copier manuellement à tout?

Autre solution

Vous pouvez également utiliser EmitMapper ou AutoMapper à faire de la copie de la propriétés.

65voto

ChrisNel52 Points 4014

Pour cloner une entité dans Entity Framework, vous pouvez simplement dissocier l'entité des DataContext , puis l'ajouter de nouveau à la EntityCollection .

 context.Detach(entity);
entityCollection.Add(entity);
 

15voto

kfm2000 Points 155

En utilisant directement la sérialisation, vous pouvez faire ceci:

http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/a967b44b-c85c-4afd-a499-f6ff604e2139/

L'aide de la Réflexion, mais avec beaucoup plus de code que vous pouvez faire ceci: http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx

10voto

diamandiev Points 930
 public static EntityObject Clone(this EntityObject Entity)
{
    var Type = Entity.GetType();
    var Clone = Activator.CreateInstance(Type);

    foreach (var Property in Type.GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.SetProperty))
    {
        if (Property.PropertyType.IsGenericType && Property.PropertyType.GetGenericTypeDefinition() == typeof(EntityReference<>)) continue;
        if (Property.PropertyType.IsGenericType && Property.PropertyType.GetGenericTypeDefinition() == typeof(EntityCollection<>)) continue;
        if (Property.PropertyType.IsSubclassOf(typeof(EntityObject)))  continue;

        if (Property.CanWrite)
        {
            Property.SetValue(Clone, Property.GetValue(Entity, null), null);
        }
    }

    return (EntityObject)Clone;
}
 

C'est une méthode simple que j'ai écrite. Cela devrait fonctionner pour la plupart des gens.

8voto

Edward Brey Points 8771

Pour ajouter une nouvelle ligne dont le contenu est basé sur une ligne existante, procédez comme suit:

  1. Obtenez une entité basée sur la ligne de départ.
  2. Définissez l'état d'entrée de l'entité sur Ajoutée.
  3. Modifier l'entité.
  4. Sauvegarder les modifications.

Voici un exemple:

 var rabbit = db.Rabbits.First(r => r.Name == "Hopper");
db.Entry(rabbit).State = EntityState.Added;
rabbit.IsFlop = false;
db.SaveChanges();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X