【问题标题】:the method 'Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql' is currently not supported当前不支持“Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql”方法
【发布时间】:2020-06-08 20:34:26
【问题描述】:

我有一种方法,如下所示 -

public string SomeMethod() {

    var resultfromdb = from u in dbContext.TableOne.FromSql("Some select query here")
    join rm in dbContext.TableTwo on u.Id equals rm.FId
    select new SomeObject() {
        /* returning some prperty */
    };

    //some business code here
    return someresult;
}

现在,当我使用 Xunit 为这个方法编写单元测试时,我在 FromSql 方法上遇到以下错误

错误:

无法解析表达式 'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[TableOne]).FromSql(value(Microsoft.EntityFrameworkCore.RawSqlString), __p_0)': 这个重载目前不支持“Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql”方法。

测试方法

[Fact]
public void Test_Method()
{
 using (var context = new dbContext())
 {
  //Arrange
   PrefillData(context);//In this method i wll add some dummy data to dbcontext
   //some mocking for other code 

   //Act
   var result = SomeMethod();

   //Assert
   Assert.Equal(expectedString, result);

}

【问题讨论】:

  • 这个测试的代码怎么样?
  • 看起来您正在使用 InMemory 数据库进行测试。如文档中所述,InMemory 数据库不支持许多数据库结构,包括 SQL。

标签: c# .net entity-framework-core asp.net-core-webapi


【解决方案1】:

您似乎正在使用内存数据库。由于它不是真正的数据库,所以不能使用 FromSQL 方法。

【讨论】:

  • 是否有其他方法可以测试 FromSQL?
  • @Voodoo 如果您查看 FromSql 中的代码,您可以看到它调用了 source.Provider.CreateQuery。这就是你必须模拟的。
  • 那么我们可以在主类中直接使用source.Provider.CreateQuery<TEntity>吗?
  • 我建议您为 DbContext 配置一个数据库提供程序。如果您要使用实体框架,请按原样使用它并作用于对象/实体
  • @Voodoo 您可以改用 SQLite in-mem 提供程序
【解决方案2】:

FromSql 更改为FromSqlRaw

dbContext.TableOne.FromSqlRaw("Some select query here")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2018-01-20
    • 1970-01-01
    • 2019-05-24
    • 2018-02-19
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多