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.
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
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; } }
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 :
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
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; } }
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.
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);
Que dois-je faire afin de résoudre ce problème ? merci d'avance pour votre aide.
Partager