Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

406
Visualizações
El procedimiento almacenado devuelve el valor de una columna, pero FromSqlRaw devuelve un valor nulo para la propiedad de la clase

Tengo una clase que es llamada por múltiples métodos. Esta clase es:

 public class Policy : EntityObject { public Guid PolicyId { get; set; } public Guid CustomerId { get; set; } public string PolicyNumber { get; set; } [NotMapped] public string TrimmedPolicyNumber { get; set; } public DateTime? PolicyEffectiveDate { get; set; } public DateTime? PolicyExpirationDate { get; set; } [NotMapped] public string PolicyType { get; set; } public string InsuranceCompany { get; set; } public string WritingCompany { get; set; } [NotMapped] public string BillMethod_PaymentPlan { get; set; } [NotMapped] public decimal? FullTermPremium { get; set; } [NotMapped] public string AccountExecutive { get; set; } [NotMapped] public string AccountRepresentative { get; set; } [NotMapped] public string PolicyLineOfBusiness { get; set; } [NotMapped] public string Status { get; set; }

Ahora tengo el siguiente proceso almacenado:

 Create PROCEDURE [GetActivePoliciesByCustomer] @CustomerId UNIQUEIDENTIFIER AS SET NOCOUNT ON; Select c.CustId as CustomerId , p.PolId as PolicyId , p.PolNo as PolicyNumber , p.PolTypeLOB as [PolicyLineOfBusiness] , p.PolEffDate as PolicyEffectiveDate , p.PolExpDate as PolicyExpirationDate , cmp.Name as InsuranceCompany , wcmp.Name as WritingCompany , pr.Description as [Status] FROM Policies p (Further details have been omitted as it is not important) GO

Este proceso almacenado devuelve datos para todos los campos enumerados anteriormente. Sin embargo, cuando hago la siguiente llamada:

 public async Task<List<Policy>> GetActivePoliciesByCustomerId(Guide customerId) { var activePolicies = await _context.Policy .FromSqlRaw<Policy>("EXEC [GetActivePoliciesByCustomer] @customerId={0}", customerId) .ToListAsync(); return activepolicies; }

Durante la sesión de depuración, veo que Status y PolicyLineOfBusiness están establecidos en nulo. Mi sospecha es que el atributo [NotMapped] impide que estos campos se asignen y lo he validado. Si elimino el atributo [NotMapped] , veo que se completan los campos Estado y PolicyLineOfBusiness. Sin embargo, esta clase (Política) es utilizada por otra llamada:

 public async Task<Policy> GetPolicyByPolicyId(Guid id) { var policyDetails = await _context.Policy .FromSqlRaw<Policy>("EXEC [GetPolicyDetailsByPolicyId] @policyId={0}", id) .ToListAsync(); return policyDetails.FirstOrDefault(); }

El proceso almacenado que está llamando:

 CREATE PROCEDURE [GetPolicyDetailsByPolicyId] @PolicyId UNIQUEIDENTIFIER AS SET NOCOUNT ON; SELECT TOP 1 p.PolId as PolicyId , p.CustId as CustomerId , p.PolNo as PolicyNumber , p.ShortPolNo as TrimmedPolicyNumber , p.PolEffDate as PolicyEffectiveDate , p.PolExpDate as PolicyExpirationDate , p.PolTypeLOB as PolicyType , c.[Name] as InsuranceCompany , wc.[Name] as WritingCompany , p.BillMethod_PaymentPlan , p.FullTermPremium , e1.[LastName] as AccountExecutive , CONCAT(e.FirstName, ' ', e.LastName) as AccountRepresentative From Policies p (Further details have been omitted as it is not important)

Si elimino el atributo [NotMapped] de las propiedades antes mencionadas (PolicyLineOfBusiness y Status) y uso el método anterior (GetPolicyByPolicyId) para llamar al proceso almacenado anterior, obtengo una excepción:

 System.InvalidOperationException: The required column 'PolicyLineOfBusiness' was not present in the results of a 'FromSql' operation.

Entonces, ¿cómo resuelvo el problema de hacer que los atributos sean opcionales y, al mismo tiempo, deberían poder asignarse a los campos devueltos por dos procesos almacenados diferentes? Si hay una mejor manera, estoy abierto a sugerencias. Gracias por adelantado.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Como la propiedad PolicyLineOfBusiness está presente en su modelo de dominio. Entonces, ambos SP deben devolver ese valor de propiedad si elimina el atributo (NotMapped). Pero al eliminar ese atributo, su segundo SP dará una excepción y el primer SP obtendrá datos. Entonces significa que el segundo SP no quiere devolver la propiedad PolicyLineOfBusiness .

Desafortunadamente, no puede hacer eso mientras escribe la propiedad PolicyLineOfBusiness obligatoria eliminando el atributo (NotMapped) en la propiedad Model del dominio. Por lo tanto, debe devolver la propiedad del segundo SP si desea mantener el mismo modelo de dominio.

 CREATE PROCEDURE [GetPolicyDetailsByPolicyId] @PolicyId UNIQUEIDENTIFIER AS SET NOCOUNT ON; SELECT TOP 1 p.PolId as PolicyId , p.CustId as CustomerId , p.PolNo as PolicyNumber , p.ShortPolNo as TrimmedPolicyNumber , p.PolEffDate as PolicyEffectiveDate , p.PolExpDate as PolicyExpirationDate , p.PolTypeLOB as PolicyType , c.[Name] as InsuranceCompany , wc.[Name] as WritingCompany , p.BillMethod_PaymentPlan , p.FullTermPremium , "" As PolicyLineOfBusiness --Have to add this as the domain model contain this property , e1.[LastName] as AccountExecutive , CONCAT(e.FirstName, ' ', e.LastName) as AccountRepresentative From Policies p (Further details have been omitted as it is not important)

Si no desea hacer esto, cree 2 modelos diferentes para 2 SP.

over 4 years ago · Santiago Trujillo Relatório

0

Para el procedimiento almacenado separado, necesitará tener modelos separados ya que la columna es diferente en ambos procedimientos almacenados.

over 4 years ago · Santiago Trujillo Relatório

0

Su clase Policies tiene propiedades PolicyType y PolicyLineOfBusiness .

en el procedimiento GetActivePoliciesByCustomer , la columna p.PolTypeLOB tiene el alias de PolicyLineOfBusiness , pero en el procedimiento GetPolicyDetailsByPolicyId , la columna p.PolTypeLOB tiene el alias de PolicyType

Entonces, la columna de origen es la misma para ambas propiedades, no entiendo el motivo, pero para evitar la excepción en el segundo procedimiento, puede modificarla agregando también el resultado requerido para PolicyLineOfBusiness :

 CREATE PROCEDURE [GetPolicyDetailsByPolicyId] @PolicyId UNIQUEIDENTIFIER AS SET NOCOUNT ON; SELECT TOP 1 p.PolId as PolicyId , p.CustId as CustomerId , p.PolNo as PolicyNumber , p.ShortPolNo as TrimmedPolicyNumber , p.PolEffDate as PolicyEffectiveDate , p.PolExpDate as PolicyExpirationDate , p.PolTypeLOB as PolicyType , p.PolTypeLOB as PolicyLineOfBusiness /* *** ADD THIS LINE *** */ , c.[Name] as InsuranceCompany , wc.[Name] as WritingCompany , p.BillMethod_PaymentPlan , p.FullTermPremium , e1.[LastName] as AccountExecutive , CONCAT(e.FirstName, ' ', e.LastName) as AccountRepresentative From Policies p (Further details have been omitted as it is not important)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda