web-dev-qa-db-ja.com

dbsetへのマップを期待せずに、Entity Framework Coreでストアドプロシージャを実行する

.NET CORE、Entity Frameworkコアに取り組んでいます。 .NETクラスから実行する必要があるプロシージャを保存しました。私のストアドプロシージャには多数の「コンテキスト」が必要であり、これを処理する方法がわかりませんが、最終的な例外であるdataViewがあります。

Context.dataModelクラスの代わりに、現在の実装(Context.Claims.FromSql)のdataViewを使用できる場合、私はうんざりします

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; }

}

ストアドプロシージャコール

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);

新しいアップデート

moduleContextクラス

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

から実行されるストアドプロシージャ

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

エラー

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

EF Core 2.1で導入された Query Types を利用できます。

まず、クラスをクエリタイプとして登録する必要があります。

_modelBuilder.Query<ClaimDataView>();
_

次に、現在の_Context.Claims_の代わりにContext.Query<ClaimDataView>()を使用できます。

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

バージョン2.1を使用していない場合は、以下を追加する必要があります。

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

moduleContextに。そして、クラスにNotMappedを追加します。

[NotMapped]
public class ClaimDataView
4
rBalzer