web-dev-qa-db-fra.com

exécuter la procédure stockée dans l'entité Framework Core sans attendre que la carte soit dbset

Je travaille sur .NET CORE, le noyau Entity Framework. J'ai une procédure stockée que je dois exécuter à partir de la classe .NET. Ma procédure stockée prend un certain nombre de "Contexte" et je ne sais pas comment traiter cela, bien que j'ai dataView qui est la dernière exception.

Je blesse si je peux utiliser mon dataView au lieu de la classe context.dataModel, implémentation actuelle (Context.Claims.FromSql)

dataView

public class ClaimDataView
{
    public Guid ClaimId { get; set; }
    public int IdNum { get; set; }
    public string Value { get; set; }
    public DateTime ExpirationDate { get; set; }
    public ClaimAttributionActions Action { get; set; }
    public bool ActiveStateForRole { get; set; }

}

appel de procédure stockée

public Guid UserId { get; set; }
public Guid ClientId { get; set; }
public Guid ConsultationId { get; set; }

  var userParam = new SqlParameter("@UserVal", UserId);
  var clientParam = new SqlParameter("@ClientVal", ConsultationId);
  var consultationParam = new SqlParameter("@ConsultationVal", ConsultationId);

 //**************need help in following line
  var query = Context.Claims.FromSql("EXECUTE dbo.ListUserClaims @userId=@UserVal, @clientId=@ClientVal, @consultationId=@ConsultationVal"
            , userParam, clientParam, consultationParam);

nouvelle mise à jour

moduleContext, classe

  protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
       //other models....
       modelBuilder.Query<ClaimDataView>();
    }

Procédure stockée exécutée à partir de

 var query = Context.Query<UserDataView>().FromSql("EXECUTE dbo.ListUserClaims @userId=@UserVal, @clientId=@ClientVal, @consultationId=@ConsultationVal"
            , userParam, clientParam, consultationParam);

erreur

System.InvalidOperationException: Cannot create a DbSet for 'UserDataView' because this type is not included in the model for the context.
 at Microsoft.EntityFrameworkCore.Internal.InternalDbQuery`1.get_EntityType()
7
Toxic

Vous pouvez utiliser les Query Types introduits dans EF Core 2.1.

Vous devez d'abord enregistrer votre classe comme type de requête:

modelBuilder.Query<ClaimDataView>();

Ensuite, vous pouvez utiliser Context.Query<ClaimDataView>() à la place de votre Context.Claims Actuel:

var query = Context.Query<ClaimDataView>().FromSql(…);
15
Ivan Stoev

Si vous n'êtes pas sur la version 2.1, vous devrez ajouter:

public DbSet<ClaimDataView> ClaimDataView { get; set; }

à votre moduleContext. Et ajoutez NotMapped à votre classe:

[NotMapped]
public class ClaimDataView
4
rBalzer