À l'aide d'un GUID pour le numéro d'identification dans une base de données avec ASP.NET MVC
Je suis en apprentissage ASP.NET MVC. Je suis l'un des tutoriaux sur asp.net. Depuis je n'ai pas toujours suivi les tutos à la lettre, j'ai décidé d'utiliser un GUID de la colonne d'identité au lieu d'un entier. Tout fonctionnait bien jusqu'à ce que j'ai obtenu jusqu'à la point de l'ajout d'un nouvel enregistrement dans la base de données par le biais de l'application MVC. Quand j'ai ajouté le nouveau record, il a inséré un vide GUID au lieu d'un générés. Voici le segment de code-behind qui gère l'insertion:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "id")]Movie movieToCreate)
{
try
{
_entities.AddToMovieSet(movieToCreate);
_entities.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
La [Bind(Exclude = "id")]
ligne 'ignore' la colonne ID, puisqu'il est généré automatiquement. Dans le tutoriel, l'ID auto-incrémenté, mais je pense que c'est parce que c'est un entier. J'ai essayé d'ajouter une ligne à cette méthode:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "id")]Movie movieToCreate)
{
try
{
movieToCreate.id = Guid.NewGuid();
_entities.AddToMovieSet(movieToCreate);
_entities.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Mais l'id est toujours un vide GUID. Quelqu'un peut-il me fournir quelques informations sur les raisons de cette et peut-être comment le résoudre?
[Bind(Exclude)]
et de garder la Guid.NewGuid()
résout ce problème. Je voudrais quand même savoir pourquoi l'ID est auto incrémenté, mais le GUID n'est pas généré automatiquement.Les deux valeurs sont générées sur le serveur. Mais l'EF ne voit que le type int car le fournisseur SQL Server renvoie généré ints à partir du serveur, mais pas Id générés. Si vous avez aliéné le contexte et la ré-interrogé, vous pouvez voir les deux.
...mais pas d'Id générés. -> ...mais pas généré de Guid.
OriginalL'auteur Anders | 2009-08-19
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un custom ModelBinder. J'ai appris à connaître les personnes de plus de ici.
Et votre contrôleur d'action serait:
Et vous devez enregistrer le classeur dans le Mondial.asax:
J'ai mis mon custom liants dans un dossier appelé dossier dans le dossier Models de mon Application MVC.
Excellent, merci pour ce!
En général, je créer un dossier Extensions dans mon projet et de mettre des trucs comme ça et HtmlHelper extensions.
OriginalL'auteur swilliams
SQL Server EF fournisseur .NET 3.5 SP1 ne peut pas récupérer générée par le serveur Guid, depuis archaïque versions de SQL Server n'a pas pu soutenir que. Donc, vous devez générer un GUID côté client, jusqu'à ce que cette prescription est fixé.
Vous peut ce faire, dans un modèle de classeur, comme swilliams suggère, mais à mon humble avis liants ne devrait lier les données dans la requête. Donc, je le fais sur mon modèle de niveau. Mais de toute façon va travailler.
Simple, vraiment. J'ai mis l'ID dans le code (avec le Guid.NewGuid()) avant d'appeler SaveChanges() lors de l'insertion d'un nouvel enregistrement. Tout cela est fait à l'intérieur d'un modèle de l'assemblée qui est distinct de l'assemblée contenant les contrôleurs et les vues.
Donc, fondamentalement, ce que j'ai fait, par la suppression de la [Bind(Execute)] dans le Film paramètre?
OriginalL'auteur Craig Stuntz
Quel est le type de champ ID dans la base de données SQL? Est-il uniqueidentifier?
Si pas, changez de type uniqueidentifier et le faire eux-mêmes.
Découvrez cette article.
Aïe...Mon mauvais..
OriginalL'auteur Sorantis
Vous pourriez aussi bien mettre à jour votre obtenir de Créer de l'Action que de la suivre et de lui donner le nouveau guid à ce point. Ensuite, il serait automatiquement transféré vers le poste d'action. La la tous code devrait ressembler à ça :
OriginalL'auteur Arno 2501