ASP.NETコアとEFコア1.1 - ストアドプロシージャを使用したDiplayデータ

asp.net-core entity-framework-core

質問

私は私の質問に問題があります。結果をビューに表示したい。

[HttpGet]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Index()
{
    return View(await _Context.Employee
                              .FromSql("EXEC sp_GetLoanDetails")
                              .ToArrayAsync());
}

ここに私が見たい項目のリストがあります:

public class StoredProcRow
{
    [Key]
    public int empID { get; set; }
    public string empFullName { get; set; }
    public double EducationalLoan { get; set; }
    public double PettyCash { get; set; }
    public double BusinessLoan { get; set; }
    public double ApplianceLoan { get; set; }
    public double EmergencyLoan { get; set; }
    public double AllPurposeLoan { get; set; }
    public double KAPUSOIILoan { get; set; }
    public double FiestaLoan { get; set; }
    public double SalaryLoan { get; set; }
    public double Pledge { get; set; }
    public double PagIbigLoan { get; set; }
    public double SSSLoan { get; set; }
    public double AllAroundLoan { get; set; }
    public double Total { get; set; }
}

注:これらのエンティティ名は、 sp_GetLoanDetails列名のエンティティと同じsp_GetLoanDetails

これはEF Core 1.1上で現在達成可能ですか?または、手動のADO.NETコードに戻る必要がありますか?

ありがとう!

受け入れられた回答

ストアドプロシージャのサポートはEntity Frameworkコアでは完全にはサポートされていませんが 、依然としてFromSqlを使用してストアドプロシージャを使用することができます。

そのためには、データベースコンテキストでは、ストアドプロシージャからマッピングするエンティティを知る必要があります。残念ながら、これを行う唯一の方法は、実際にはデータベースコンテキスト内のエンティティとして定義することです。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<StoredProcRow>(entity =>
    {
        // …
    });
}

次に、そのエンティティのセットに対してFromSqlメソッドを実行して、ストアドプロシージャを使用できます。

public virtual IQueryable<StoredProcRow> GetLoanDetails()
{
    return Set<StoredProcRow>().FromSql("[sp_GetLoanDetails]").AsNoTracking();
}

ここで、 AsNoTrackingを使用すると、ストアドプロシージャから来たエンティティへの変更をデータコンテキストが追跡するのを避けることができます(とにかく更新する方法がないため)。とにかくストアドプロシージャなしでセットを使用することができないので、メソッド内でSet<T>()を使用して、データベースコンテキスト上のメンバとして型を公開しないようにします。

Btw。 FromSql渡すSQL文のEXECは必要ありません。ストアドプロシージャ名とその引数を渡すだけです。例:

Set<MyEntity>().FromSql("[SomeStoredProcedure]");
Set<MyEntity>().FromSql("[SProcWithOneArgument] @Arg = {0}");
Set<MyEntity>().FromSql("[SProcWithTwoArguments] @Arg1 = {0}, Arg2 = {1}");

人気のある回答

NuGetからSystem.Data.CommonとSystem.Data.SqlClientを追加します。これにより、ADO.NETコマンド、つまりストアドプロシージャを実行できます。

https://forums.asp.net/post/6061777.aspx



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ