web-dev-qa-db-fra.com

Cadre d'entité. Afficher les enregistrements en double de retour

J'utilise Entity Framework qui contient la vue. Et j'ai une requête:

var data = this.context.vwRevenues
    .Where(x => x.revenue >= 0);
    .OrderByDescending(x => x.year)
    .ThenByDescending(x => x.month)
    .Take(10)
    .ToList();

Cette requête renvoie un ensemble d'entités, mais la 1ère entité est égale à la 5ème.

data[0] == data[4] // true

Je prends le script sql pour cette requête depuis sql tracer et l'exécute dans SQL Management Studio, il renvoie différents enregistrements.

43

Selon @ Giovane Réponses

Nous avons eu le même problème dans notre système avec Entity Framework traitant des vues. Essayez d'utiliser ROW_NUMBER () OVER () SQL pour créer une colonne avec des valeurs uniques, mais cela n'a pas fonctionné.

J'ai fait la même chose, mais pour le faire fonctionner, j'ai besoin d'ouvrir le modèle EDMX, puis de sélectionner une colonne comme clé d'entité.

enter image description here

Ensuite, cela fonctionnera

Il y a un très bon article à ce sujet

enregistrements en double

La ligne d'articles la plus importante est:

Lorsque vous incluez une vue dans votre modèle d'entité, le modèle semble simplement utiliser les premières colonnes non nulles comme clé primaire (car toutes les colonnes utilisées dans la clé primaire doivent être non nullable).

83
Moons

Il vous suffit de faire: context.viewname.AsNoTracking().Where(x => x.ColumnName != null);

51
Rahul Garg

Nous avons eu le même problème dans notre système avec Entity Framework traitant des vues. Essayez d'utiliser ROW_NUMBER () OVER () SQL pour créer une colonne avec des valeurs uniques, mais cela n'a pas fonctionné.

Nous devons insérer un champ de plus, un FK pour une autre table dans la vue afin qu'il puisse ajouter comme formation supplémentaire pour mebro EntityKeyMembers Elimite et donc le problème de répétition.

Ainsi, si le problème persiste dans ce type de situation, la solution est d'insérer une colonne FK pour qu'elle soit MEMBRES des champs qui forment l'EntityKey de la table.

12
Giovane

Dans la vue, essayez de convertir le premier enregistrement en une valeur non nulle, comme ceci:

isnull(ROW_NUMBER() OVER (ORDER BY "Column"), 0) AS Row

Il indique à Entity Framework qui peut être automatiquement la clé primaire.

Si vous ne souhaitez pas mettre à jour edmx et définir une clé sur la colonne &&

si vous ne souhaitez pas mettre à jour l'enregistrement de vue (uniquement pour obtenir l'enregistrement), utilisez le code ci-dessous pour que cela fonctionne.

context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking;

context.viewname.Where(x => x.columnname != null);
1
Rikin Patel