J'ai un problème étrange lors de la suppression d'enregistrements en utilisant linq, mon soupçon est qu'il a quelque chose à voir avec la variable de plage (nommé source
). Après la suppression d'un enregistrement toutes les cibles pour un client sont récupérés à l'aide de la déclaration suivante:linq 'variable variable' problème
var q = from source in unitOfWork.GetRepository<db_Target>().Find()
where source.db_TargetBase.db_Person.fk_Customer == customerID
select source.FromLinq();
où FromLinq est dans la méthode extention sur db_target:
public static Target FromLinq(this db_Target source)
{
return new Target
{
id = source.id,
LastModified = source.db_TargetBase.LastModified,
...
}
}
Lorsqu'un enregistrement est supprimé à la fois db_Target
et db_TargetBase
sont supprimés . Lorsque, par exemple, deux utilisateurs suppriment des enregistrements, linq essaie de récupérer un enregistrement pour user2 qui est supprimé par user1, provoquant un plantage sur la ligne LastModified = source.db_TargetBase.LastModified
car db_TargetBase
est null
.
Lorsque vous utilisez le code suivant le problème n'occure et que les enregistrements non supprimés sont récupérés:
var q = from source in unitOfWork.GetRepository<db_Target>().Find()
where source.db_TargetBase.db_Person.fk_Customer == customerID
select new Target
{
id = source.id,
LastModified = source.db_TargetBase.LastModified,
...
};
Ce engende deux questions:
- Qu'est-ce qui se passe ici? Est-ce que je fais une copie de la variable de plage
source
parce que je l'utilise dans une méthode de prolongation? - Comment est-ce que je peux "envelopper" le code
return new Target
? Je l'utilise à plusieurs endroits et je ne veux pas le copier à chaque fois. Rendre mon code plus difficile à maintenir.
TIA,
JJ
Merci pour le respone, votre explication me semble parfaitement logique. Je suis en vacances maintenant, mais quand j'aurai le temps, je vais tester la mise en œuvre et donner les commentaires appropriés. – user124936