2010-10-20 2 views
37

Uso Entity Framework che contiene view. E ho una domanda:Quadro entità. Visualizza record duplicati di restituzione

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

Questa query restituisce un insieme di entità, ma la prima entità è uguale a 5th.

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

prendo script SQL per questa query da SQL tracciante ed eseguirlo in SQL Management Studio, restituisce diversi record.

+0

possibile duplicato del [Entità risultato quadro discrepanza per viste di database] (http://stackoverflow.com/questions/3111112/entity-framework-result- discrepanza-per-un-database-viste) –

+2

serbatoi per la tua risposta. ha aiutato –

+1

risolto in questa discussione http://stackoverflow.com/questions/3977920/entity-framework-view-return-duplicate-records – bunjeeb

risposta

67

Come per @Giovane di risposta

abbiamo avuto lo stesso problema nel nostro sistema con Entity Framework trattare con vista. Prova a utilizzare ROW_NUMBER() OVER() SQL per creare una colonna con valori univoci, ma non ha funzionato.

Ho fatto la stessa cosa ma per farlo funzionare ho bisogno di aprire il modello EDMX e quindi selezionare questa colonna come chiave di entità .

enter image description here

allora funzionerà

C'è un ottimo articolo su questo

Duplicate Records

gli articoli linea più importante è:

Quando compresi una vista nel tuo En tity Model, il modello sembra semplicemente utilizzare le prime colonne non annullabili come chiave primaria (poiché tutte le colonne utilizzate nella chiave primaria dovrebbero essere non annullabili).

+3

tu salva My Life – Loai

+0

Cosa si intende per "le prime colonne non annullabili"? Quanti esattamente? Certamente non tutti, altrimenti non sarei incappato nel problema in una vista senza colonne non annullabili. –

+0

Questa era una piccola caratteristica subdola ... Grazie per l'ottima soluzione! – CodeBreaker

12

Abbiamo avuto lo stesso problema nel nostro sistema con Entity Framework che riguarda le visualizzazioni. Prova a utilizzare ROW_NUMBER() OVER() SQL per creare una colonna con valori univoci, ma non ha funzionato.

Abbiamo bisogno di inserire un campo di più, un FK per un'altra tabella nella vista in modo che possa aggiungere come ulteriore addestramento per mebro EntityKeyMembers Elimite e quindi il problema della ripetizione.

Pertanto, se il problema persiste in questo tipo di situazione, la soluzione è inserire una colonna FK affinché sia ​​MEMBRI dei campi che formano EntityKey della tabella.

+0

Leggi la risposta di @Juan Carlos Sánchez Robles. ROW_NUMBER è un buon modo per andare ma avvolgerlo con una funzione ISNULL – buckley

2

Nella vista Prova a convertire il primo record di un valore non nullo, in questo modo:

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

Si segnala Entity Framework che può essere la chiave primaria automaticamente.

1

Se non si desidera aggiornare edmx e impostare un tasto qualsiasi per colonna & &

se non si desidera aggiornare Visualizza (solo per ottenere il record) poi usare il codice sotto il suo lavoro per me.

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

context.viewname.Where(x => x.columnname != null); 
+0

speravo di non dover cambiare edmx, ma questo purtroppo non ha funzionato per me – sobelito

34

Hai solo bisogno di fare: context.viewname.AsNoTracking().Where(x => x.ColumnName != null);

+1

Grazie un po 'per il suggerimento AsNoTracking(), molto più facile da aggiungere rispetto a dover modificare le nostre entità per un'altra chiave ROW :) – John

+0

Questo ha funzionato per me . (E non ha rimosso alcuni record dove l'aggiornamento EDMX ha fatto.) – sobelito

+0

Grazie, questo ha funzionato anche per me, dove la mia vista non aveva campo chiave primaria – user230910