Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.NET Core和EF Core 1.1-使用存储过程显示数据_Asp.net Core_Entity Framework Core - Fatal编程技术网

Asp.net core ASP.NET Core和EF Core 1.1-使用存储过程显示数据

Asp.net core ASP.NET Core和EF Core 1.1-使用存储过程显示数据,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,我对我的问题有疑问。我想在视图上显示结果 [HttpGet] [ValidateAntiForgeryToken] public async Task<IActionResult> Index() { return View(await _Context.Employee .FromSql("EXEC sp_GetLoanDetails") .ToArray

我对我的问题有疑问。我想在视图上显示结果

[HttpGet]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Index()
{
    return View(await _Context.Employee
                              .FromSql("EXEC sp_GetLoanDetails")
                              .ToArrayAsync());
}
注意:这些实体名称与
sp_getLoAndDetails

现在在EF Core 1.1上可以实现吗?还是需要返回到手动ADO.NET代码


谢谢

虽然Entity Framework Core对存储过程的支持并不完全存在,但您仍然可以使用
FromSql
使用它来使用存储过程

为此,数据库上下文需要从存储过程中知道要映射到的实体。不幸的是,目前唯一的方法是将其实际定义为数据库上下文中的实体:

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

    modelBuilder.Entity<StoredProcRow>(entity =>
    {
        // …
    });
}
请注意,我在这里使用了
AsNoTracking
,以避免使用数据上下文来跟踪来自存储过程的实体的更改(因为您无论如何都无法更新它们)。此外,我还在方法中使用
Set()
,以避免将类型作为数据库上下文中的成员公开,因为在没有存储过程的情况下无法使用该集

顺便说一句,在从sql传递到
的sql语句中,您不需要(不确定这是否有效)
EXEC
。只需将存储过程名称和任何参数传递给它,例如:

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

虽然Entity Framework Core对存储过程的支持并不完全存在,但您仍然可以使用
FromSql
来使用存储过程

为此,数据库上下文需要从存储过程中知道要映射到的实体。不幸的是,目前唯一的方法是将其实际定义为数据库上下文中的实体:

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

    modelBuilder.Entity<StoredProcRow>(entity =>
    {
        // …
    });
}
请注意,我在这里使用了
AsNoTracking
,以避免使用数据上下文来跟踪来自存储过程的实体的更改(因为您无论如何都无法更新它们)。此外,我还在方法中使用
Set()
,以避免将类型作为数据库上下文中的成员公开,因为在没有存储过程的情况下无法使用该集

顺便说一句,在从sql
传递到
的sql语句中,您不需要(不确定这是否有效)
EXEC
。只需将存储过程名称和任何参数传递给它,例如:

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

从NuGet添加System.Data.Common和System.Data.SqlClient。这些允许运行ADO.NET命令,即存储过程


从NuGet添加System.Data.Common和System.Data.SqlClient。这些允许运行ADO.NET命令,即存储过程


旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀@马克,注意到了,谢谢!旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀@马克,注意到了,谢谢!你好@poke,我对设置有点问题,我是否需要下载
Microsoft.EntityFrameworkCore.Relational
?只是一个想法,因为
集合有问题。FromSql
之类的…是的,为了运行
FromSql
,您需要依赖
Microsoft.EntityFrameworkCore.Relational
,因为SQL是一个关系型的东西。感谢您提供的信息。它现在解决了我的问题。。。谢谢你的解决方案。。保存我的一天。@假设我的sp返回一个由3列组成的结果集,如say RName、RId、OrgId。我用这三个属性创建了一个实体。就像下面的公共类resultcollection{public int Rid{get;set;}public Nullable OrgId{get;set;}public string RName{get;set;}}那么,如果我需要调用sp@user1447718,那么模型创建应该是什么样子的呢?您可以像其他实体一样为存储过程设置实体(请参阅以获取帮助)。因此,您甚至可以使用数据注释,然后只需要调用
modelBuilder.Entity()
。或者使用实体生成器显式设置模型。您好@poke,我对设置有点问题,是否需要下载
Microsoft.EntityFrameworkCore.Relational
?只是一个想法,因为
集合有问题。FromSql
之类的…是的,为了运行
FromSql
,您需要依赖
Microsoft.EntityFrameworkCore.Relational
,因为SQL是一个关系型的东西。感谢您提供的信息。它现在解决了我的问题。。。谢谢你的解决方案。。保存我的一天。@假设我的sp返回一个由3列组成的结果集,如say RName、RId、OrgId。我用这三个属性创建了一个实体。就像下面的公共类resultcollection{public int Rid{get;set;}public Nullable OrgId{get;set;}public string RName{get;set;}}那么,如果我需要调用sp@user1447718,那么模型创建应该是什么样子的呢?您可以像其他实体一样为存储过程设置实体(请参阅以获取帮助)。因此,您甚至可以使用数据注释,然后只需要调用
modelBuilder.Entity()
。或者使用实体生成器显式设置模型。