IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entity Framework Discussion :

EF5 code first - problème objets imbriqués


Sujet :

Entity Framework

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut EF5 code first - problème objets imbriqués
    Bonjour,
    Je découvre Entity Framework 5 code first et je me trouve face à un problème lors de l’ajout d’un nouvel objet.
    Modèle :
    J’utilise 2 classes, Projet et Techno avec une relation N – N. Pour un projet j’utilise N technologies ; et une technologie est utilisée dans N projets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    [DataContract(IsReference = true)]
    [Table("Project")]
    public class Project
        {
            public Project() { }
     
            [DataMember]
            [Key]
            [Required]
            [Column("Id")]
            public int Id { get; set; }
     
            [DataMember]
            [Required]
            [Column("Name")]
            public string Name { get; set; }
     
     
            [DataMember]
            public virtual List<Techno> Technos { get; set; }
        }
     
    [DataContract(IsReference = true)]
        [Table("Techno")]
        public class Techno
        {
            public Techno() { }
     
            [DataMember]
            [Key]
            [Required]
            [Column("Id")]
            public int Id { get; set; }
     
            [DataMember]
            [Column("Name")]
            public string Name { get; set; }
     
     
            public virtual List<Project> Projects { get; set; }
        }
    Context :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    public class CarreerModelContext : DbContext
        {
            public CarreerModelContext()
                : base("name=DBCarreer")
            {
                var context = ((IObjectContextAdapter)this).ObjectContext;
                context.ContextOptions.ProxyCreationEnabled = false;
            }
     
            public DbSet<Project> Projects { get; set; }
            public DbSet<Techno> Technos { get; set; }
     
     
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //Permet de ne pas créer la base
                Database.SetInitializer<CarreerModelContext>(null);
     
     
                //Déclaration relation N N
                modelBuilder.Entity<Project>().
                    HasMany(c => c.Technos).
                    WithMany(p => p.Projects).
                        Map(
                              m =>
                              {
                                  m.MapLeftKey("Id_Project");
                                  m.MapRightKey("Id_Techno");
                                  m.ToTable("ProjectTechno");
                              });
     
            }
        }

    Repository : je l’utilise pour la communication avec la BDD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    public class Repository<T> where T : class
        {
            private DbContext _db;
     
            public Repository(DbContext p_DBContext)
            {
                this._db = p_DBContext;
            }
     
            public T Add(T p_Item)
            {
                try
                {
                    if (p_Item != null)
                    {
                        this._db.Set<T>().Add(p_Item);
                        this._db.SaveChanges();
                    }
                }
                catch (Exception)
                {
                    p_Item = null;
                    throw;
                }
                return p_Item;
            }
     
            public List<T> Get(Expression<Func<T, bool>> predicate, List<String> p_IncludeString)
            {
                List<T> items = null;
                try
                {
     
                    IQueryable<T> req = this._db.Set<T>();
     
                    if (predicate != null)
                    {
                        req = req.Where<T>(predicate).AsQueryable<T>();
                    }
     
                    if (p_IncludeString != null)
                    {
                        foreach (string include in p_IncludeString)
                        {
                            req = req.Include(include).AsQueryable<T>();
                        }
                    }
                    items = req.ToList<T>();
     
                }
                catch (Exception)
                {
                    throw;
                }
                return items;
            }        
     
        }

    Service Web WCF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    [ServiceContract]
        public interface ICarreer
        {
     
     
            [OperationContract]
            Project AddProject(Project p_Project);
     
            [OperationContract]
            List<Techno> GetTechnos();
     
        }
     
    public Project AddProject(Project p_Project)
            {
                try
                {
                    using (CarreerModelContext db = new CarreerModelContext())
                    {
                        Repository<Project> rep = new Repository<Project>(db);
                        return rep.Add(p_Project);
                    }
                }
                catch (Exception)
                {
     
                    throw;
                }
            }
     
     
     
            public List<Techno> GetTechnos()
            {
                try
                {
                    using (CarreerModelContext db = new CarreerModelContext())
                    {
                        Repository<Techno> rep = new Repository<Techno>(db);
                        return rep.Get(null, null);
                    }
                }
                catch (Exception)
                {
     
                    throw;
                }
            }
    La partie cliente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    CarreerClient proxy = new CarreerClient();
     
                //Get all technos
                List<Techno> technologies = proxy.GetTechnos();
     
                //Create Project 
                Project p1 = new Project();
                p1.Name = "Projet 1";
     
                //Affectation des deux prèmière technologies
                p1.Technos = new List<Techno>();
                p1.Technos.Add(technologies[0]);
                p1.Technos.Add(technologies[1]);
     
                // Sauvegarde du projet
                proxy.AddProject(p1);
    Problème : Lorsque j’ajoute mon projet, les technologies déjà présentes en base de données sont également ajoutées une autre fois. Je me retrouve avec des doublons en base de données.

    Que dois-je faire afin de résoudre ce problème ? merci d'avance pour votre aide.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 37
    Points
    37
    Par défaut
    Salut,

    Pour moi ça tiens du fait que tu ne sois plus dans le même context.
    Du coup pour EF tes technos sont belles et bien de nouvelles technos.

    Essai d'utiliser le même context pour la récupération de ta liste de technos et la création de ton projet. Je pense que tu n'auras plus de problème de doublons

    Bzzz

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Salut,

    Essayes de faire un attach de tes technos avant de faire ton save
    Cela remettra tes objets dans le context (et normalement il se basera sur l'identifiant de ton objet pour ne pas le réinsérer dedans mais juste l'attacher au context).

Discussions similaires

  1. Objet imbriqués problème compilation
    Par ludo86 dans le forum Débuter
    Réponses: 2
    Dernier message: 30/07/2009, 00h29
  2. Réponses: 1
    Dernier message: 24/05/2006, 15h08
  3. Réponses: 2
    Dernier message: 05/05/2006, 15h10
  4. [code::blocks] Problème d'importation de librairie
    Par kei-kun41 dans le forum Code::Blocks
    Réponses: 5
    Dernier message: 27/03/2006, 23h58
  5. [Code::Blocks] Problème de linkage: "msvcrt.lib"
    Par skhay dans le forum Code::Blocks
    Réponses: 8
    Dernier message: 14/03/2006, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo