【发布时间】:2021-12-23 07:25:14
【问题描述】:
我有一个由多种方法调用的类。这个类是:
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; }
现在我有以下存储过程:
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
此存储过程返回上面列出的所有字段的数据。但是,当我拨打以下电话时:
public async Task<List<Policy>> GetActivePoliciesByCustomerId(Guide customerId)
{
var activePolicies = await _context.Policy
.FromSqlRaw<Policy>("EXEC [GetActivePoliciesByCustomer] @customerId={0}", customerId)
.ToListAsync();
return activepolicies;
}
在调试会话期间,我看到 Status 和 PolicyLineOfBusiness 设置为 null。我怀疑[NotMapped] 属性会阻止这些字段被映射,我已经验证了这一点。如果我删除 [NotMapped] 属性,我会看到填充了 Status 和 PolicyLineOfBusiness 字段。但是,这个类(Policy)被另一个调用使用:
public async Task<Policy> GetPolicyByPolicyId(Guid id)
{
var policyDetails = await _context.Policy
.FromSqlRaw<Policy>("EXEC [GetPolicyDetailsByPolicyId] @policyId={0}", id)
.ToListAsync();
return policyDetails.FirstOrDefault();
}
它正在调用的存储过程:
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)
如果我从上述属性(PolicyLineOfBusiness 和 Status)中删除 [NotMapped] 属性并使用以前的方法(GetPolicyByPolicyId)调用上述存储过程,我会得到一个异常:
System.InvalidOperationException: The required column 'PolicyLineOfBusiness' was not present in the results of a 'FromSql' operation.
那么我该如何解决使属性可选的问题,同时它们应该能够映射到两个不同的存储过程返回的字段?如果有更好的方法,我愿意接受建议。提前致谢。
【问题讨论】:
-
也许您可以拥有一个具有公共字段的类,并为第二个存储过程创建另一个具有继承性的类?或者它不是一种选择?
-
不相关,但为什么名为 'GetPolicyDetailsByPolicyId' 的 proc 需要 TOP 1 ?
-
您使用的是哪个 dbms? (上面的 SQL 是特定于产品的。)
-
请将sample code 设为最小且完整。大多数
Policy属性和数据库列都可以删除,并添加了_context的声明。
标签: c# sql entity-framework-core