EF Core FromSQLRaw не вызывает базу данных? - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно переписать старый веб-сервис, потому что команда, которая поддерживала старый, больше не хочет поддерживать его своим новым инструментом. Поэтому я переписываю его, используя ASP. NET Core WebAPI и EF Core 3.1.

Большинство логи c для службы застряли в хранимых процедурах, написанных годами go. Ничего супер сложного, но на самом деле не думаю, что это хорошая идея, чтобы начать все переписывать.

Проблема в том, что поддержка EF Core для хранимых процедур в лучшем случае кажется недостаточной. Я получил один работающий с использованием Database.ExecuteSqlRaw, который возвращает результаты в качестве выходных параметров, но у меня возникли проблемы с другим, который возвращает результаты в виде набора данных. (На самом деле два, но давайте не будем забегать вперед ... Я прокомментировал это, так что сейчас он возвращает только один.)

(Текущая) проблема с запросом .FromSqlRaw состоит в том, что он не кажется, вообще запрашивает базу данных, когда я наблюдаю за ней в XEvent Profiler. (SQL Server 2016.)

Вот код, который я использую для вызова про c:

var bundle_id = new SqlParameter("bundle_id", bundleID) { Direction = ParameterDirection.Input };

var result = this.BundleUserGuideDetails.FromSqlRaw("EXEC dbo.p_fetch_user_guide_details @bundle_id", bundle_id);

var deets = result.FirstOrDefault<BundleUserGuideDetail>();

Я создал DBSet для него в классе DBContext:

public DbSet<BundleUserGuideDetail> BundleUserGuideDetails { get; set; }

И так как это безключевой тип, я получил его в соответствии с руководством Microsoft по бесключевым объектам:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BundleUserGuideDetail>(eb =>
       {
           eb.HasNoKey();                   
       });
    }

В созданной мной модели все имена полей совпадают с возвращаемыми данными. также.

Так почему БД даже не вызывается для этого?

РЕДАКТИРОВАТЬ: Забыл написать, что вызов FirstOrDefault вызывает «System.InvalidOperationException:« Последовательность не содержит элементов »»

РЕДАКТИРОВАТЬ: Вот полный текст исключения:

System.InvalidOperationException: Sequence contains no elements
   at System.Linq.ThrowHelper.ThrowNoElementsException()
   at System.Linq.Enumerable.Aggregate[TSource](IEnumerable`1 source, Func`3 func)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.EntityMaterializerInjectingExpressionVisitor.ProcessEntityShaper(EntityShaperExpression entityShaperExpression)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.EntityMaterializerInjectingExpressionVisitor.VisitExtension(Expression extensionExpression)
   at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
   at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
   at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
   at System.Linq.Expressions.BlockExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression`1 node)
   at System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.EntityMaterializerInjectingExpressionVisitor.Inject(Expression expression)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.InjectEntityMaterializers(Expression expression)
   at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.VisitShapedQueryExpression(ShapedQueryExpression shapedQueryExpression)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.VisitExtension(Expression extensionExpression)
   at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
   at MandTBank.BBFB.BPS.BPSWebAPI.Data.BundleSystemContext.FetchUserGuideDetails(String bundleID) in C:\Users\tdevmcr\Source\Workspaces\BBFB\NeedsAssessmentSystem\Main\Sourcecode\BBFB NAS - I3 - BundleUserGuide Service\MandTBank.BBFB.BPS.BPSWebAPI\Data\BundleSystemContext.cs:line 65

1 Ответ

0 голосов
/ 11 февраля 2020

Оказывается, я допустил простую ошибку и не смог сделать поля в модели public

Исключение, которое вы бросаете, конечно, не делает это очевидным ...

Мне также нужно было добавить AsEnumerable() после вызова FromSqlRaw, чтобы он работал, согласно этому вопросу: Включить с FromSqlRaw и хранимой процедурой в EF Core 3.1

...