Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Web avec .NET > ASP.NET MVC
ASP.NET MVC Forum d'entraide sur le développement de site web avec le framework ASP.NET MVC.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/01/2013, 17h50   #1
Anthares
Invité régulier
 
Inscription : mars 2010
Messages : 55
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 55
Points : 8
Points : 8
Par défaut Problème d'association zero-to-many

Bonjour à tous,

J'imagine que le titre n'ai pas forcément très parlant, mais j'ai un problème qui vous paraîtra simple mais que je trouve compliqué.

J'ai commencé depuis peu à essayé de programmer en ASP .Net et après quelques lectures, je me suis lancé dans la création d'un petit site pour recenser les cartes d'un jeu. Jusque là c'est simple

Mon problème se produit lorsque j'essaie de remplir ma base de données pour débugger et j'obtiens un message dans ce goût là

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Multiplicity constraint violated. The role 'Card_Classes_Source' of the relationship 'TestDatabase.Models.Card_Classes' has multiplicity 1 or 0..1.
 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
 
Exception Details: System.InvalidOperationException: Multiplicity constraint violated. The role 'Card_Classes_Source' of the relationship 'TestDatabase.Models.Card_Classes' has multiplicity 1 or 0..1.
 
Source Error: 
 
 
Line 153:			cards[2].Classes.Add(classes[1]);
Line 154:			cards[2].Classes.Add(classes[2]);
Line 155:			context.SaveChanges();
Line 156:		}
Line 157:	}
Le schéma est le suivant

Ma classe Card

Code :
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
 
public class Card
	{
		public int CardID { get; set; }
 
		[Required(ErrorMessage = "The card name is required.")]
		[MaxLength(250, ErrorMessage = "The card name cannot be longer than 250 characters.")]
		[Display(Name = "Nom")]
		public string Name { get; set; }
 
		[Required(ErrorMessage = "The card level is required.")]
		[Range(0, 6, ErrorMessage = "Le niveau de la carte doit être entre 0 et 6.")]
		[Display(Name = "Niveau")]
		public int Level { get; set; }
 
		[Required(ErrorMessage = "The card url is required.")]
		[MinLength(50, ErrorMessage = "The card url must contains at least 50 characters.")]
		[MaxLength(300, ErrorMessage = "The card url cannot be longer than 300 characters.")]
		[Display(Name = "Carte")]
		public string URL { get; set; }
 
		[Display(Name = "Classes")]
		public virtual ICollection<Classe> Classes { get; set; }
 
		public Card()
		{
			Classes = new List<Classe>();
		}
	}
Ma classe Classe

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public class Classe
	{
		[DatabaseGenerated(DatabaseGeneratedOption.None)]
		public int ClasseID { get; set; }
 
		public string Name { get; set; }
		public string Logo { get; set; }
 
		public Classe() { }
		public Classe(int id = -1, string name = "", string logo = "") 
		{
			ClasseID = id;
			Name = name;
			Logo = logo;
		}
	}
Et voici ce que je fais pour initialiser dans la méthode Seed de mon DropCreateDatabaseIfModelChanges

Code :
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
 
 
/// Classes
			var classes = new List<Classe>
			{
				new Classe (1, "Combattant", "/Content/combattant.png"),,
				new Classe (2, "Mage", "/Content/mage.png"),
				new Classe (3, "Prêtre", "/Content/pretre.png"),
			};
			classes.ForEach(s => context.Classes.Add(s));
			context.SaveChanges();
 
/// Cards
			var cards = new List<Card>
			{
				new Card {Name = "Perso 1", Level = 5, URL = "/Content/Perso.png"},
				new Card {Name = "Perso 2", Level = 6, URL = "/Content/Perso.png"},
				new Card {Name = "Perso 3", Level = 5, URL = "/Content/Perso.png"}
			};
 
			cards.ForEach(s => context.Cards.Add(s));
			context.SaveChanges();
 
			cards[0].Classes.Add(classes[0]);
			cards[0].Classes.Add(classes[1]);
			cards[1].Classes.Add(classes[1]);
			cards[2].Classes.Add(classes[1]);
			cards[2].Classes.Add(classes[2]);
			context.SaveChanges();
Sachant que ma liste de classe sera fixe au final et qu'une carte peut avoir 0 ou plusieurs classes.

Je n'arrive pas à comprendre ce qui ne vas pas

Comme je vous l'ai dit, ça peut paraître bête, mais là je bloque vraiment.

En espérant que vous pourrez m'aider.

Merci d'avance de votre aide
Anthares est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 14h03   #2
Anthares
Invité régulier
 
Inscription : mars 2010
Messages : 55
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 55
Points : 8
Points : 8
J'ai trouvé au final

Pour ceux que ça intéresseraient, il fallait que je mette une collection de carte associée à la classe pour que cela marche

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
[DatabaseGenerated(DatabaseGeneratedOption.None)]
		public int ClasseID { get; set; }
 
		public string Name { get; set; }
		public string Logo { get; set; }
		public string Slug { get; set; }
 
		public virtual ICollection<Card> Cards { get; set; }
 
		public Classe() {
			Cards = new List<Card>();
		}
		public Classe(int id = -1, string name = "", string logo = "", string slug = "") 
		{
			ClasseID = id;
			Name = name;
			Logo = logo;
			Slug = slug;
			Cards = new List<Card>();
		}
Anthares est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h19.


 
 
 
 
Partenaires

Hébergement Web