在实体Framework Core中执行存储过程而不期望映射到dbset

Tox*_*xic 7 c# stored-procedures entity-framework-core .net-core

我正在研究.NET CORE,实体框架核心.我有需要从.NET类执行的存储过程.我的存储过程需要多个'Context',我不知道如何处理这个,虽然我有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; }

}
Run Code Online (Sandbox Code Playgroud)

存储过程调用

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);
Run Code Online (Sandbox Code Playgroud)

新的更新

moduleContext类

  protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
       //other models....
       modelBuilder.Query<ClaimDataView>();
    }
Run Code Online (Sandbox Code Playgroud)

从中执行的存储过程

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

错误

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()
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 15

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

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

modelBuilder.Query<ClaimDataView>();
Run Code Online (Sandbox Code Playgroud)

然后你可以用来Context.Query<ClaimDataView>()取代你当前的Context.Claims:

var query = Context.Query<ClaimDataView>().FromSql(…);
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,“FromSql”已替换为“FromSqlInterpolated”和“FromSqlRaw”。 (4认同)
  • @EgorPavlikhin 我想这取决于你想要做什么。在这种情况下避免 DbSet 的原因是不将实体映射到表。无键类型将您的类型注册到 EF 模型,而无需在 DB 端为其创建表。然后,您可以将存储过程与您的类型一起使用。 (2认同)

rBa*_*zer 6

If you are not on version 2.1, you will need to add:

public DbSet<ClaimDataView> ClaimDataView { get; set; }
Run Code Online (Sandbox Code Playgroud)

to your moduleContext. And add NotMapped to your class:

[NotMapped]
public class ClaimDataView
Run Code Online (Sandbox Code Playgroud)