Dans Entity Framework, obtenir la valeur d'une colonne d'identité après l'insertion
Je suis en utilisant EF4. Je veux insérer une nouvelle MyObject dans la base de données. Monobjet a deux champs:
Id: int (Identité) et
Nom: chaîne de
Comme je l'ai vu dans la documentation Entity Framework est supposée être MyObject.Id de la valeur générée par la base de données après l'appel à SaveChanges() mais dans mon cas, cela n'arrive pas.
using (var context = new MyEntities())
{
var myObject = MyObjects.CreateMyObject(0, "something"); //The first parameter is identity "Id"
context.MyObjects.AddObject(myObject);
context.SaveChanges();
return myObject.Id; //The returned value is 0
}
Mise à JOUR:
Ce qui se passe dans l'un de mes entités et d'autres fonctionnent très bien. En passant, j'ai vérifié et la base de données de la colonne est de l'identité et de la StoreGeneratedPattern est définie à l'Identité.
Voici le SSDL. Je ne vois pas la différence. Le premier n'est pas de travailler à droite:
<EntityType Name="OrgUnit">
<Key>
<PropertyRef Name="Srl" />
</Key>
<Property Name="Srl" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="TypeId" Type="smallint" Nullable="false" />
<Property Name="Name" Type="varchar" Nullable="false" MaxLength="80" />
</EntityType>
<EntityType Name="OrgType">
<Key>
<PropertyRef Name="Srl" />
</Key>
<Property Name="Srl" Type="smallint" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="Title" Type="varchar" Nullable="false" MaxLength="120" />
<Property Name="Options" Type="int" Nullable="false" />
</EntityType>
La mise à jour se fait avec succès dans la base de données et l'identité est générée, mais l'entité objet n'est pas mis à jour avec la nouvelle identité.
source d'informationauteur nima | 2011-06-10
Vous devez vous connecter pour publier un commentaire.
Dans ce cas, vous EF modèle n'est probablement pas à jour - EF devrait automatiquement votre nouvelle identité à partir de la base de données. Essayez de rafraîchir votre modèle EF.
Votre colonne d'identité des propriétés devrait ressembler à ceci dans votre modèle EDMX:
Si vous utilisez Oracle Entity Framework 4 Fournisseur, comme je le fais, à partir de ODP.NET, il y a un bug dans le Concepteur. Il vous suffit de sélectionner l'Identité de la valeur dans la zone de liste déroulante ne le fera pas. Il va annoter la propriété conceptuelle dans le modèle conceptuel avec
comme dans
Mais, il ne pourra pas faire de même pour le Modèle de Stockage, c'est à dire. vous devrez le faire manuellement. De trouver le Bien (dans mon cas, ID) dans EntityType d'intérêt et d'ajouter StoreGeneratedPattern="Identité".
Je ne suis pas au courant de la même bug dans SQL EF fournisseur 'cos je n'ai pas l'utiliser.
Cela, il faut "juste travail". Assurez-vous que la DB colonne est en fait
IDENTITY
et queStoreGeneratedPattern
est définie à l'Identité dans l'EDMX.wow! c'était un cauchemar, mais enfin je l'ai résolu, bien que je n'ai pas compris quel était le problème. Peut-être que cela aide quelqu'un avec le même problème.
Essayer à l'aide de méthode d'actualisation après avoir Enregistrer les Modifications, il a été documentée dans MSDN
"Assurer que les objets sur le client ont été mis à jour par la source de données du côté de la logique, vous pouvez appeler la méthode Refresh avec le StoreWins valeur après l'appel SaveChanges."
http://msdn.microsoft.com/en-us/library/bb336792.aspx
Bien que je sente qu' @Craig a suggéré peut également travailler.
Si vous êtes à l'aide de Linq to entities, et vous obtenez cette erreur, même si vous avez suivi les conseils de marc_s (qui sont vraiment bons), vous devez regarder votre entités directement dans l'edmx (xml) et vérifier si elles ont l'attribut suivant :
La StoreGeneratedPattern="Identité" est également nécessaire.
Je suis tombé sur ce sujet aujourd'hui. La différence était bien j'ai été en utilisant une fonction d'insertion, où la personne ne précise pas que. Ce que j'avais à faire était de faire mon insérer une fonction de retour de procédure stockée SCOPE_IDENTITY() et l'utilisation d'un résultat contraignante pour l'id retourné.
Fixé mon problème.