Gestion de la concurrence EF avec l'attribut Timestamp dans l'approche Model First
-
12-12-2019 - |
Question
J'essaie de mettre en œuvre la solution donnée dans Gestion de la concurrence avec Entity Framework dans une application ASP.NET MVC .
L'article dit :
Ajout d'une propriété de suivi à l'entité Department
Dans Models\Department.cs, ajoutez une propriété de suivi :
[Timestamp] public Byte[] Timestamp { get; set; }
L'attribut Timestamp précise que cette colonne sera incluse dans la clause Where des commandes Update et Delete envoyées à la base de données.
Puisque j'utilise un modèle d'abord approche, j'ai suivi les étapes 1 à 5 décrites dans Création d'une colonne Timestamp avec Entity Framework
- Ajoutez une propriété nommée « Timestamp » à l'entité dans le modèle EF
- Définir le type sur binaire
- Définir nullable sur false
- Définissez StoreGeneratedPattern sur Computed
- Définir ConcurrencyMode sur Fixe
Lorsque je mets à jour mon code à partir du modèle de base de données, Models\Department.cs contient désormais
public virtual byte[] Timestamp
{
get;
set;
}
Ensuite, j'ai utilisé la classe de métadonnées pour spécifier l'attribut Timestamp :
// Metadata for Department entity
public class DepartmentMetadata
{
[Timestamp]
public byte Timestamp { get; set; }
}
T1. J'ai testé si la valeur du Timestamp
la colonne change en cas de modifications de ligne.Ce n'est pas le cas.
MODIFIER 1 Le problème était dû au fait que le type de colonne SQL Server était binary
, là où il aurait dû être du type timestamp
.La modification du type de données a résolu le problème de la colonne Timestamp qui n'était pas mise à jour.
Q2. J'essayais de modifier la même entité (en utilisant "Ouvrir dans un nouvel onglet") pour voir si un OptimisticConcurrencyException
Est lancé.Ce n'est pas le cas.Qu'est-ce que je fais mal?S'il vous plaît, aidez-moi à comprendre, merci.
La solution
Le problème était dû au fait que j'avais un ObjectContext par session HTTP, et donc ouvrir un nouvel onglet et le tester PAS provoquer une exception de concurrence.