datatables des loggings incorrects de la table sans PK

Je travaille avec une database que je ne peux pas modifier. Il y a une table qui garde la trace des changements dans les autres tables et n'a pas de key primaire. J'ai été capable de reproduire le problème que j'ai dans une database de test. Le server sql est MS-SQL 2008 R2.

CREATE TABLE [dbo].[TrackerTest]( [Action] [varchar](50) NULL, [Date] [int] NOT NULL, [Time] [int] NOT NULL, [TrackComment] [varchar](254) NULL ) ON [PRIMARY] 

Les dates sont des magasins sous forme d'entiers au format yyyymmdd et le time est le nombre de secondes écastings depuis minuit.

et ceci est un fragment d'une application console.

  var db = new DataTestEntities(); var track = from t in db.TrackerTests select t; foreach (var test in track) { Console.WriteLine("{0}, {1}, {2}, {3}", test.Action, test.Date, test.Time, test.TrackComment); } Console.ReadLine(); 

Mon problème est le suivant: s'il y a 2 loggings avec les mêmes valeurs de date et d'heure, ils affichent tous les deux les mêmes valeurs Action et TrackComment même s'ils sont différents dans la database. Par exemple: avec ces données dans la database:

 insert into TrackerTest Values('action1',20141114,49231,'comment1'); insert into TrackerTest Values('action2',20141114,49231,'comment2'); insert into TrackerTest Values('action3',20141107,27028,'comment3'); insert into TrackerTest Values('action4',20141121,51633,'comment4'); insert into TrackerTest Values('action5',20141121,51633,'comment5'); 

Je reçois cette sortie dans l'application console

 action1, 20141114, 49231, comment1 action1, 20141114, 49231, comment1 action3, 20141107, 27028, comment3 action4, 20141121, 51633, comment4 action4, 20141121, 51633, comment4 

Le nombre d'loggings est correct mais le contenu ne l'est pas.

Ai-je raté quelque chose ou est-ce un bug?

J'ai cherché une solution appropriée à ce problème mais pas de chance jusqu'à maintenant. Comme indiqué par @Chris Ballance " EF ne joue pas bien avec les tables non-PK. " Je ne peux pas réparer le model puisque le fournisseur tiers ne me permet pas de le faire, donc je ne sais pas si cela pourrait être considéré une solution ou un travail autour. Donc, voici comment je l'ai résolu. Sur un autre server que nous avons, j'ai créé une connection au premier server en utilisant "Linked Server" . Dans ce server, il y a une database que j'ai créée et mon application aussi. Je viens d'append une procédure stockée qui exécute la requête dans le server lié. Appelez la procédure stockée à partir de EF et toutes datatables sont là comme il se doit. Espérons que cela aide quelqu'un d'autre.

Vous pouvez essayer de mettre à jour votre code de boucle pour l'utiliser à la place:

 foreach (var t in db.TrackerTests.ToList()) 

Cela empêchera le chargement paresseux de l'énumération que vous êtes en boucle et pourrait juste résoudre votre problème.

Cependant, si vous travaillez avec une table qui n'a pas de key primaire, vous ne travaillez pas vraiment avec une table, juste un graphe de données sans moyen bien défini d'énumérer ou de suivre un index.

Corrigez votre model au lieu d'utiliser la bande pour résoudre le problème Si vous ne pouvez pas modifier la database, searchz celui qui le peut et découvrez pourquoi les keys primaires ne sont pas définies dans cette table.