2010-12-07 47 views
2

Si je table db comme:EF4: Pourquoi Translate() n'utilise pas le mappage de table?

CREATE TABLE MyTable 
(
MyTableId INT PRIMARY KEY, 
MyTableName CHAR(10) 
) 

et entité dans le cadre de l'entité 4 (POCO, suivi auto) défini comme:

MyTable - maps to MyTable table 
- Id - maps to MyTableId 
- Name - maps to MyTableName 

pourquoi est cette requête:

SqlConnection conn = (SqlConnection)((EntityConnection)context.Connection).StoreConnection; 
conn.Open(); 
SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable", conn); 
DbDataReader result = cmd.ExecuteReader(); 
var objResult = context.Translate<MyTable>(result); 

Échec de dire:

The data reader is incompatible with the specified 'Project1.MyTable'. A member of the type, 'Id', does not have a corresponding column in the data reader with the same name.

La méthode Translate ne doit-elle pas prendre en compte les mappages de table définis dans edmx? Est-il possible de faire ce travail sans définir explicitement les colonnes dans la requête?

Répondre

0

MSDN dit:

La Traduire méthode vous permet de exécuter une requête standard ADO.NET contre une source de données et traduire les lignes de données renvoyées dans l'entité objets. Le DbDataReader fourni doit contenir les données correspondant au type d'entité demandé .

Il n'est pas explicitement si elle correspond par nom ou via la carte, mais étant donné que cette requête ADO.NET n'est pas une requête d'entité (et est donc pas strictement lié aux couches d'abstraction), il semble raisonnable qu'il pourrait l'ignorer et opter pour les correspondances de nom de propriété.

Je me demande si vous devriez écrire un ESQL store query, plutôt qu'une requête de base de données TSQL? J'espère qu'une requête ESQL est mappée via le modèle. Cela devrait être assez simple; il pourrait être juste

var objResult = context.ExecuteStoreQuery<TEntity>(@"select * from MyTable"); 
+0

Je l'ai déjà essayé ExecuteStoreQury et il ne fonctionne pas avec exactement la même erreur (je suppose qu'il utilise Traduire en interne). – veljkoz