0

J'ai un modèle mappé à la base de données via EF7. Toutes les propriétés sont identiques aux colonnes mappées de la table.Entity Framework 7 Résultat de la procédure stockée au modèle

Maintenant, j'ai une procédure stockée, qui renvoie des colonnes jointes, mais la base est toujours le modèle mappé.

Voici mon modèle (Entité) qui est mappé à Table1 sur ma base de données.

public partial class Table1 { public int id { get; set; } public bool Column1{ get; set; } public int Column2 { get; set; } public int Column3 { get; set; } public int Column4 { get; set; } public int Column5 { get; set; } }

Mon StoredProcedure retourne toutes ces colonnes et de plus d'une colonne d'une autre table, qui contient des informations supplémentaires sur cet objet.

Alors Mon StoredProcedure ressemble à ceci:

CREATE PROCEDURE Table1_Select 
    AS 
     BEGIN 
      SELECT Column1, 
        Column2, 
        Column3, 
        Column4, 
        Column5, 
        Table2.JoinedColumn1 
      FROM Table1 
      JOIN Table2 on Table1.ID = Table2.ID_Table1 
     END 

Mon idée était d'ajouter juste une propriété au modèle

public string JoinedColumn1 {get; set;} 

Cela fonctionne pour exécuter le StoredProcedure, mais il ne fonctionne pas dès comme je veux obtenir une entité avec

MyContext.Table1.FirstOrDefault(t=>t.id == 1) 

cela renvoie toujours un serveur Erreur 500 dans Fiddler alors que l'exécution de la procédure stockée avec "Table1.FromSql (" Table1Select ")" fonctionne correctement. Ou dois-je décider d'utiliser StoredProcedures pour mon modèle ou d'accéder directement aux entités?

Des bonnes pratiques ou des solutions pour cela?

Merci beaucoup à l'avance. Nicn

+0

Pourquoi ne pas les procédures de magasin inclus dans le projet en utilisant Entity Framework Database Première approche? –

+0

Comment ajouter une commande StoredProcedures dans Scaffold? J'ai seulement trouvé [ce lien] (https://github.com/aspnet/EntityFramework/wiki/Design-Meeting-Notes- (Octobre-1, -2015) # table-selection-in-reverse-engineering) qui dit - t pour les tables ou -s pour les schémas ... – nicn

Répondre

0

essayer cette façon,

var results = db.Database.SqlQuery<YourModel>("exec YourSPName [Optional Parameters]").ToList(); 
+0

'return context.Table1.FromSql' fonctionne correctement lorsque j'ajoute la colonne jointe en tant que propriété, cependant' context.Table1.ToList() 'ne fonctionne plus. – nicn

+0

Pouvez-vous s'il vous plaît fournir le code? –

+0

Modèle: 'public partial class Table1 { public int id {get; ensemble; } public bool Column1 {get; ensemble; } public int Colonne2 {get; ensemble; } public int Colonne3 {get; ensemble; } public int Colonne4 {get; ensemble; } public int Colonne5 {get; ensemble; } public string JoinedColumn1 {get; ensemble; } } ' Commande de travail: ' StringBuilder sql = new StringBuilder(); sql.Append ("EXEC Table1_Select"); retour Table1.FromSql (sql.ToString()) ToList(); ' commande de travail Non. ' retour context.Table1.ToList(); ' ou avez-vous besoin des fichiers? – nicn

0

J'ai lu d'une source comme l'utilisation de la solution échantillon de connexion ADO.NET.

Paramètres Exemple

try 
{ 
      SqlDataAdapter adapt = new SqlDataAdapter("Table1_Select", ConnectionString); 
      adapt.SelectCommand.Parameters.AddWithValue("@yourparameters", param); 

      adapt.SelectCommand.CommandType = CommandType.StoredProcedure; 
      DataTable dt = new DataTable(); 
      adapt.Fill(dt); 
      adapt.Dispose(); 
      adapt = null; 

      return dt; 
} 
catch(Exception ex) 
{ 
throw ex 
} 

Ne pas Paramètres échantillon; Vous obtenez des colonnes de table pouvant être datées et lues des valeurs dataTable et définissez vos valeurs de données de classe.

Lire DataTable Exemple:

DataTable dt = YourGetDataTableFunction(val); 
    DataRow dr = dt.Rows[0]; //index is zero 
string Column1 = dr["column1"].ToString(); 
string Column2 =dr["column2"].ToString(); 

J'espère que ça aide.

Autre question: How to run stored procedures in Entity Framework Core?

0

la question n'est pas que je ne peux pas obtenir des données de StoredProcedure. Le problème est qu'en raison de la méthode storedProcedure, mon modèle a plus de propriétés que de colonnes dans la table de base de données. Cependant, j'aimerais toujours accéder aux entités-modèles parfois directement sans utiliser de procédure stockée qui ne fonctionne pas car le débogueur dit "colonne invalide" pour la colonne qui n'est pas dans la table mais dans la procédure stockée.

Espérons que cela soit plus clair.

Merci encore à l'avance.

Nicn

0

De votre message récent, vous avez dit que vous utilisez même modèle et d'obtenir l'erreur, donc je voudrais suggérer que l'utilisation [NOTMAPPED] avant pertcular déclaré entité permet de dire,

public int Column5 { get; set; } qui est utilisé pendant que vous appelez votre SP, donc écrire comme,

[NotMapped] 
public int Column5 { get; set; } 
+0

Cela fonctionne pour les entités, mais '.FromSql (" exec SP_Name ")' ne retourne pas cette colonne maintenant. Dois-je utiliser Akin pour storedProcedures pour obtenir la valeur de cette colonne? – nicn

+0

avez-vous essayé? ça pourrait marcher pour toi. var results = db.Database.SqlQuery ("exec YourSPName [Paramètres facultatifs]"). ToList(); –

+0

Il semble que dans 7.0.0-rc1-final FromSql a remplacé SqlQuery et doit être contre un DbSet. Nous verrons dans l'équipe de quelle façon nous irons et quels cas peuvent apparaître dans notre projet. merci beaucoup pour vos efforts dans ce domaine. – nicn