Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

400
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda