Вызов хранимой процедуры с командой «FromSqlRaw», возвращающей ошибку - PullRequest
0 голосов
/ 06 апреля 2020

Я видел эту ошибку в похожих вопросах, но это мой первый удар. Net Я хочу убедиться, что мой код c# не является виновником. Ошибка возникает, когда хранимая процедура вызывается с помощью команды FromSqlRaw. Я подтвердил, что отправляю правильные значения в команду FromSqlRaw, но ошибка сообщает о ключе?

См. Код ниже:

Контроллер

public class HomeController : Controller
{
    private IStudent _info;

    private readonly StudentInformation _studentInformation;

    public HomeController(IStudent info)
    {
        _info = info;
    }

    //public async Task<IActionResult> Index([FromQuery] Student student)
    public IActionResult Index([FromQuery] Student student)
    {
        int id = student.Id;

        if (id == 0) 
        {
            return NotFound(); 
        }

        var model = _info.GetById(id);

        return View(model);
    }
}

Студент Класс

public class Student
{
    public int Id_Num { get; set; }

    public string StudentName { get; set; }
    public string PreferredName { get; set; }
    public string Gender { get; set; }

    public string DOB { get; set; }
    public string Resident { get; set; }

    public string F1Visa { get; set; }
    public string Division { get; set; }
    public string Tuition { get; set; }
    public string cohort { get; set; }
    public string Ferpa { get; set; }
} 

public class StudentInformationService : IStudent
{
    private StudentInfo _info;

    public StudentInformationService(StudentInfo info)
    {
        _info = info;
    }

    public IEnumerable<Student> GetAll()
    {
        throw new NotImplementedException();
    }

    public Student GetById(int id)
    {
        return _info.StudentRow
                   .FromSqlRaw("StudentRegistrationInfo @IdNum, @OldIdNum", 
                               new SqlParameter("IdNum", id),
                               new SqlParameter("OldIdNum", id))
                   .AsEnumerable().FirstOrDefault();
    }
}

Вот ошибка:

InvalidOperationException: Тип сущности 'Student' требует определения первичного ключа. Если вы намеревались использовать тип сущности без ключа, вызовите метод HasNoKey ().

Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys (модель IModel, регистратор IDiagnosticsLogger)

* 1019F. Инфраструктура Microsoft.E. ModelValidator.Validate (модель IModel, регистратор IDiagnosticsLogger)

Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Validate (модель IModel, регистратор IDiagnosticsLogger)

* 1023Ler. .Validate (модель IModel, регистратор IDiagnosticsLogger)

Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher + ImmediateConventionScope.OnModelFinalized (IConventionModelBuilder modelBuilderMain.MeEniteMera. FinalizeModel ()

Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel (контекст DbContext, IConventionSetBuilder ConventionSetBuilder)

Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel ()

Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model ()

Microsoft. FactoryCallSite factoryCallSite, контекст RuntimeResolverContext)

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor.VisitCallSiteMain (ServiceCallSite, вызов CallSite, аргумент TArgument)

* ServiceSiteSiteSiteSite.RuSec. , Контекст RuntimeResolverContext, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeSupSecInSenseSite VisitCallSite (ServiceCallSi т.е. callSite, аргумент TArgument)

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor (контекст ConstructorCallSite. , Аргумент TArgument)

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache (CallSite ServiceCallSite, контекст RuntimeResolverContext, serviceProviderEngineScope serviceProviderEngine *. VisitScopeCache (ServiceCallSite singletonCallSite, контекст RuntimeResolverContext)

Microsoft. Resolver.Resolve (CallSite ServiceCallSite, область действия ServiceProviderEngineScope)

Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (поставщик IServiceProvider, тип serviceType)

* 1060.Der. GetRequiredService (поставщик IServiceProvider)

Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies ()

Microsoft.EntityFrameworkCore.DbContext.

Microsoft.EntityFrameworkCore.DbContext.get_Model ()

Microsoft.EntityFrameworkCore.Internal.InternalDbSet. 1073 *

Microsoft.EntityFrameworkCore.Internal.InternalDbSet.System.Linq.IQueryable.get_Provider ()

Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSqlRaw * параметры объекта [DbSet], строка * 11 *, строка * 11

StudentServices.StudentInformationService.GetById (int id) в StudentInformationService.cs +

return _info.StudentRow.FromSqlRaw ("StudentRegistrationInfo @IdNum, @OldIdNum",

StudentChecklist.Controllers.HomeController.Index (Student student) в HomeController.cs +

var model = _info.GetById (id);

lambda_method (Closure, object, Object [])

Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute (цель объекта , Параметры объекта [])

Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker + d__12.MoveNext ()

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача)

Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker + d__10.MoveNext ()

* time ExceptionDispatchInfo.Throw ()

Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker.Rethrow (контекст ActionExecutedContext)

Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvxt. далее, ссылка Область действия, состояние объекта ref, ссылка bool isCompleted)

Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker + d__14.MoveNext () * 110 7 *

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задача)

Microsoft.Asp48Inore. .ResourceInvoker + d__22.MoveNext ()

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()

Microsoft.AspNetCore. Mvc .Internal.ResourceInvoker.Rethrow (ResourceExecuted 11text) *

Microsoft.AspNetCore. Mvc .Internal.ResourceInvoker.Next (ref State следующий, ref Область видимости, ref object object, ref bool isCompleted)

Microsoft.AspNetCore. Mvc .Internal. ResourceInvoker + d__17.MoveNext ()

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger26) Задача 1125 (только для задачи) .AspNetCore. Mvc .Internal.ResourceInvoker + d__15.MoveNext ()

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Th row ()

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача)

Microsoft.AspNetCore.Builder.RouterMiddleware + d__4.MoveNext () * 1133.untime ()

* time34) 11 .ExceptionServices.

1 Ответ

1 голос
/ 06 апреля 2020

Ошибка действительно довольно очевидна - ваш Student класс модели не определяет первичный ключ для сущности (что и должно быть - всегда).

По соглашению , Id или (classname)Id (здесь: StudentId) автоматически будет считаться первичным ключом - поскольку у вас нет ни одного из них, вам необходимо явно аннотировать столбец, который будет использоваться в качестве первичного ключа - скорее всего, столбец Id_Num - с аннотацией [Key] - например:

public class Student
{
    [Key]
    public int Id_Num { get; set; }

    // remainder of your properties
} 
...