Il problema
In poche parole, la mappatura non si comporta come previsto. La reason
variabile locale torna come nulla, quindi l'assegnazione a nav
imposta anche l'oggetto nidificato Reason
.
Mi sto perdendo qualcosa di semplice qui?
La stored procedure
ALTER PROCEDURE [PA].[spGetDocumentNavById]
-- Add the parameters for the stored procedure here
@DocumentNavID INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
dn.DocumentNavID,
dn.IssuerName,
nt.Name,
dn.Amount,
dn.BTF,
dn.NavDate,
dn.ReceivedDate,
dn.PrimaryIdentifier,
dn.AssetID,
dh.LastModifiedBy,
dh.IsApproved,
dh.Corrected,
dh.ReasonID
FROM PA.DocumentNavs dn WITH(NOLOCK)
JOIN PA.NAVTypes nt WITH(NOLOCK)
ON nt.NAVTypeID = dn.NavTypeID
LEFT JOIN PA.DocumentsHistory dh WITH(NOLOCK)
ON dh.DocumentID = dn.DocumentID
LEFT JOIN PA.Analysts a WITH(NOLOCK)
ON a.AnalystID = dh.LastModifiedBy
WHERE dn.DocumentNavID = @DocumentNavID
Il C #
public DocumentNav FindById(int documentNavId)
{
var data = new
{
documentNavId
};
using (var conn = SqlConnection)
{
var response = conn.Query<DocumentNav, Reason, DocumentNav>("[PA].spGetDocumentNavById",
map: (nav, reason) =>
{
nav.Reason = reason;
return nav;
}, param: data, splitOn: "ReasonID", commandType: System.Data.CommandType.StoredProcedure)
.DefaultIfEmpty().FirstOrDefault();
return response;
}
}
Dapper è in grado di dividere la query della riga restituita dalle colonne Id ("Id" o "id"). Se la tua chiave primaria è diversa o desideri dividere la riga in un punto diverso da Id, utilizza il parametro opzionale "splitOn".
Nel tuo esempio la query dovrebbe essere simile a:
SELECT
-- DocumentNav Object Columns
dn.DocumentNavID AS "Id",
dn.IssuerName,
-- ... all other DocumentNav properties..
-- Reason Object Columns
dh.ReasonID AS "Id"
dh.LastModifiedBy,
dh.IsApproved,
dh.Corrected
-- ... all other Reason properties..
FROM PA.DocumentNavs dn WITH(NOLOCK)
JOIN PA.NAVTypes nt WITH(NOLOCK)
ON nt.NAVTypeID = dn.NavTypeID
LEFT JOIN PA.DocumentsHistory dh WITH(NOLOCK)
ON dh.DocumentID = dn.DocumentID
LEFT JOIN PA.Analysts a WITH(NOLOCK)
ON a.AnalystID = dh.LastModifiedBy
WHERE dn.DocumentNavID = @DocumentNavID
Hai bisogno che i tuoi oggetti siano con nome proprietà "Id" (DocumentNav & Reason)