L'ajout d'un Élément avec Plusieurs-à-Plusieurs Relations Dans le Cadre de l'Entité
Je suis une violation de clé primaire d'erreur lorsque je tente d'ajouter un élément à plusieurs-à-plusieurs relations:
J'ai deux classes: les Articles et les Balises qui ont un plusieurs-à-plusieurs relations :
public class Article
{
public int ID { get; set; }
public string Text { get; set; }
public ICollection<Tag> Tags { get; set; }
}
public class Tag
{
[Key]
public string UrlSlug { get; set; }
public string Name { get; set; }
public ICollection<Article> Articles{ get; set; }
}
Quand j'ajoute une nouvelle Article je permettre à l'utilisateur d'entrer des Tags et puis je veux créer une nouvelle Balise si la Balise n'est pas encore créé dans la base de données ou ajouter le Tag de la collection de Balises de l'Article objet si le Tag existe déjà.
Donc quand je crée le nouvel Article objet que j'appelle le dessous de la fonction:
public static Tag GetOrLoadTag(String tagStr)
{
string tagUrl = Tag.CreateTagUrl(tagStr);
var db = new SnippetContext();
var tagFromDb = from tagdummy in db.Tags.Include(x => x.Articles)
where tagdummy.UrlSlug == tagUrl
select tagdummy;
if (tagFromDb.FirstOrDefault() != null)
{ return tagFromDb.FirstOrDefault(); }
else
{
//create and send back a new Tag
}
}
Cette fonction essentiellement vérifie si il y a un Tag dans la base de données et si oui retourne cette Balise qui est ensuite ajoutée à l'Étiquette de la collecte de l'Article objet de l'article.Les balises.Ajouter().
Cependant, lorsque je tente de sauver ce à l'aide du code ci-dessous je reçois une Violation de la contrainte de CLÉ PRIMAIRE d'erreur
db.Entry(article).State = EntityState.Modified;
db.SaveChanges();
Je ne peux pas comprendre comment je devrais aller sur juste de créer un lien entre l'Article et le déjà existant Tag.
OriginalL'auteur Judo | 2011-07-26
Vous devez vous connecter pour publier un commentaire.
Utiliser la même instance de contexte pour l'ensemble du traitement de votre opération et votre vie sera beaucoup plus facile:
Si vous ne voulez pas charger l'article de la base de données (cette requête est redondant si vous savez que l'article existe), vous pouvez utiliser:
c'est pourquoi je vous ai demandé "Alors, assurez-vous que lorsque vous êtes à la récupération de la balise à partir de la db dans votre code que vous utilisez le même datacontext que vous utilisez lors de l'appel de SaveChanges"
Juste pour remarque, depuis que je suis tombé ici -- si vous êtes à la abstraire du contexte derrière un modèle d'espace de stockage assurez-vous que vous pouvez correctement partager le contexte par l'injection d'usine/. Mais si vous partagez le contexte à travers des méthodes/étendues que vous pourriez rencontrer des problèmes où échec s'engage rupture ultérieure sans rapport avec commet -- quelque chose comme ça "annuler" méthode pourrait aider? rundevrun.blogspot.com/2012/06/...
que faire si il est un beaucoup de beaucoup de relation?
Cela signifie que vous n'avez pas une seule Balise d'objet, mais une séquence d'entre eux (récupéré à partir d'une liste de case à cocher à partir de l'INTERFACE utilisateur, par exemple). Si vous avez juste à faire une telle opération d'ajout de la Balise à l'intérieur d'une boucle.
OriginalL'auteur Ladislav Mrnka
Comment allez-vous créer de nouvelles balises? Et comment faites-vous pour joindre l'existant ou entité créée à l'article.
Utiliser quelque chose comme
Lire cet article http://thedatafarm.com/blog/data-access/inserting-many-to-many-relationships-in-ef-with-or-without-a-join-entity/
Quand c'est un tag gratuit vous devez laisser le framework sais que c'est un gratuit entité. Le cadre est d'essayer d'insérer l'entité de nouveau. Et s'il vous plaît assurez-vous que vous avez défini l'identité de la colonne de la clé primaire.
Ok, alors comment puis-je laisser le cadre de connaître ses une entité existante?
Définir le champ de clé primaire que INT de l'IDENTITÉ et de voir si cela fonctionne?
Voir ce stackoverflow.com/questions/1173001/...
OriginalL'auteur Dasith Wijes