在实体框架核心中执行存储过程,而不期望映射到dbset

问题描述 投票:0回答:2

我正在研究.NET CORE,实体框架核心。我有需要从 .NET 类执行的存储过程。我的存储过程需要“上下文”的数量,我不知道如何处理这个问题,尽管我有 dataView 这是最后的例外。

如果我可以使用我的 dataView 而不是 context.dataModel 类,当前实现(Context.Claims.FromSql),我会很受伤

数据视图

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()
c# stored-procedures .net-core entity-framework-core
2个回答
52
投票

更新(EF Core 8.0+):

EF Core 8.0 最终通过 SqlQuerySqlQueryRaw 添加了对未映射类型的原始 SQL 查询的支持,所以现在您可以简单地使用

var query = Context.SqlQueryRaw<ClaimDataView>(...);

无需在模型中注册

ClaimDataView

原文:

您可以利用 EF Core 2.1 中引入的查询类型

首先,您需要将类注册为查询类型:

modelBuilder.Query<ClaimDataView>();

然后您可以使用

Context.Query<ClaimDataView>()
代替当前的
Context.Claims
:

var query = Context.Query<ClaimDataView>().FromSql(...);

更新(EF Core 3.x+)

从 EF Core 3.0 开始,查询类型已与实体类型合并并重命名为无键实体类型,因此对应的代码为

modelBuilder.Entity<ClaimDataView>().HasNoKey().ToView(null);

var query = Context.Set<ClaimDataView>().FromSql(...);

6
投票

如果您使用的不是 2.1 版本,则需要添加:

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

到你的模块上下文。 并将 NotMapped 添加到您的班级中:

[NotMapped]
public class ClaimDataView
© www.soinside.com 2019 - 2024. All rights reserved.