I am working on a Automated email using a CRM project and I am having issues mapping my classes,I am trying to map the details from my Invoice header to a class named Fact2. (Essentially the details of my invoice ). I made a test to investigate more but I just don't understand why it's telling me i am missing a map.
This is the error that my tests finds.
InvoiceHeaderWhereTest Duration: 3,5 sec
Message: Test method Common.DAL.CompanyDB.Sales.Tests.InvoiceHeaderRepositoryTests.InvoiceHeaderWhereTest threw exception: System.InvalidOperationException: Missing map from Common.DAL.CompanyDB.Fact2 to Common.BLL.Entities.CustomerEntities.InvoiceHeader. Create using CreateMap<Fact2, InvoiceHeader>.
Stack Trace: ExpressionBuilder.CreateMapExpressionCore(ExpressionRequest request, Expression instanceParameter, IDictionary
2 typePairCount, LetPropertyMaps letPropertyMaps, TypeMap& typeMap) ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary
2 typePairCount, LetPropertyMaps letPropertyMaps) ExpressionBuilder.CreateMapExpression(ExpressionRequest request) <.ctor>b__1() Lazy1.CreateValue() Lazy
1.LazyInitValue() Lazy1.get_Value() ExpressionBuilder.GetMapExpression(Type sourceType, Type destinationType, Object parameters, MemberInfo[] membersToExpand) ProjectionExpression.ToCore(Type destinationType, Object parameters, IEnumerable
1 memberPathsToExpand) ProjectionExpression.ToCore[TResult](Object parameters, IEnumerable1 memberPathsToExpand) ProjectionExpression.To[TResult](Object parameters, Expression
1[] membersToExpand) Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Object parameters, Expression1[] membersToExpand) Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Expression
1[] membersToExpand) Repository4.Where[TOut](IEnumerable
1 where, Expression1 select) line 105 Repository
4.Where[TOut](Expression1 where, Expression
1 select) line 93 Repository4.Where(Expression
1 where) line 88 InvoiceHeaderRepositoryTests.InvoiceHeaderWhereTest() line 39
This is my Test
[TestMethod()]
public void InvoiceHeaderWhereTest()
{
IKernel kernel = NinjectBootstrapper.LoadNinjectKernel(() => new LicenceUsage() { Company = new CompanyProfile() { SqlDatabase = "ProtoDB" } });
var factory = kernel.Get<UnitOfWork>();
var repo = factory.GetRepository<InvoiceHeader>(kernel.Get<LicenceUsage>());
var entity = repo.Where(x => true);
Assert.IsNotNull(entity);
}
This is my POCO
using Common.BLL.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Common.BLL.Entities.CustomerEntities
{
public class InvoiceHeader : EntityBaseWithDetails<InvoiceDetail, string>
{
public decimal? AmountTax { get; set; }
public decimal? AmountTotal { get; set; }
public decimal? AmountWithoutTaxes { get; set; }
public DateTime? AvaTaxComittedDate { get; set; }
public long? AvataxTransactionID { get; set; }
public string BatchNumber { get; set; }
public string BillOfLading { get; set; }
public string BillToAddress2 { get; set; }
public string BillToContact { get; set; }
public string BillToContactFax { get; set; }
public string BillToContactPhone { get; set; }
public string BillToCustomer { get; set; }
public string BillToCustomerAddress { get; set; }
public string BilltoCustomerCity { get; set; }
public string BillToCustomerCountry { get; set; }
public string BillToCustomerName { get; set; }
public string BillToCustomerProvince { get; set; }
public string BillToCustomerZipCode { get; set; }
public string BillToProvinceCode { get; set; }
public string Carrier { get; set; }
public DateTime? ConfirmationDate { get; set; }
public string Currency { get; set; }
public decimal CurrencyFactor { get; set; }
public decimal CurrentBalance { get; set; }
public string CustomerInvoice { get; set; }
public string CustomerOrder { get; set; }
public DateTime? DateDelivery { get; set; }
public DateTime? DatePrinted { get; set; }
public decimal? DiscountAvailable { get; set; }
public DateTime? DiscountDate { get; set; }
public string DocumentType { get; set; }
public bool ExportReferenceInAccountingSystem { get; set; }
public string Fob { get; set; }
public int InvoiceType { get; set; }
public bool IsContractExchangeRate { get; set; }
public string IsPrinted { get; set; }
public override string Label => this.Code;
public string LastUser { get; set; }
public string Note { get; set; }
public DateTime? PaidDate { get; set; }
public string PaymentTerm { get; set; }
public string PONumber { get; set; }
public string ReferenceNumber { get; set; }
public string Revenu { get; set; }
public string Salesman { get; set; }
public string ShippingMode { get; set; }
public string ShippingOrder { get; set; }
public string ShipToAddress2 { get; set; }
public string ShipToCustomer { get; set; }
public string ShipToCustomerAddress { get; set; }
public string ShipToCustomerCity { get; set; }
public string ShipToCustomerCountry { get; set; }
public string ShipToCustomerName { get; set; }
public string ShipToCustomerProvince { get; set; }
public string ShipToCustomerZipCode { get; set; }
public string ShipToProvinceCode { get; set; }
public int Status { get; set; }
public string TaxGroup { get; set; }
public string Territory { get; set; }
public string Warehouse { get; set; }
}
}
This is my mapping profile.
using AutoMapper;
using AutoMapper.EquivalencyExpression;
using Common.BLL.Entities.CustomerEntities;
using Common.DAL.CompanyDB;
using Common.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Common.DAL.MainDB
{
internal class InvoiceHeaderMappingProfile : Profile
{
public InvoiceHeaderMappingProfile()
{
this.CreateMap<Fact, InvoiceHeader>()
.ForMember(dst => dst.AmountTax, opt => opt.MapFrom(src => src.Taxes))
.ForMember(dst => dst.AmountTotal, opt => opt.MapFrom(src => src.Total))
.ForMember(dst => dst.AmountWithoutTaxes, opt => opt.MapFrom(src => src.Montant))
.ForMember(dst => dst.AvaTaxComittedDate, opt => opt.MapFrom(src => src.AvataxCommittedDate))
.ForMember(dst => dst.AvataxTransactionID, opt => opt.MapFrom(src => src.AvataxTransactionID))
.ForMember(dst => dst.BillToAddress2, opt => opt.MapFrom(src => src.CIH_BillToAddress2))
.ForMember(dst => dst.CustomerInvoice, opt => opt.MapFrom(src => src.No_Fact))
.ForMember(dst => dst.ReferenceNumber, opt => opt.MapFrom(src => src.Noref))
.ForMember(dst => dst.DocumentType, opt => opt.MapFrom(src => src.Type))
.ForMember(dst => dst.Territory, opt => opt.MapFrom(src => src.Territoire))
.ForMember(dst => dst.PaidDate, opt => opt.MapFrom(src => src.PaidDate))
.ForMember(dst => dst.DatePrinted, opt => opt.MapFrom(src => src.Dateimpression))
.ForMember(dst => dst.PONumber, opt => opt.MapFrom(src => src.No_Po))
.ForMember(dst => dst.Salesman, opt => opt.MapFrom(src => src.Vendeur))
.ForMember(dst => dst.ShippingMode, opt => opt.MapFrom(src => src.Exp_Mod))
.ForMember(dst => dst.ShippingOrder, opt => opt.MapFrom(src => src.No_Exp))
.ForMember(dst => dst.ShipToAddress2, opt => opt.MapFrom(src => src.CIH_ShipToAddress2))
.ForMember(dst => dst.ShipToCustomer, opt => opt.MapFrom(src => src.Exp_A1))
.ForMember(dst => dst.ShipToCustomerCity, opt => opt.MapFrom(src => src.Exp_A4))
.ForMember(dst => dst.ShipToCustomerProvince, opt => opt.MapFrom(src => src.Exp_A5))
.ForMember(dst => dst.ShipToCustomerZipCode, opt => opt.MapFrom(src => src.Exp_A6))
.ForMember(dst => dst.Revenu, opt => opt.MapFrom(src => src.Revenu))
.ForMember(dst => dst.Currency, opt => opt.MapFrom(src => src.Devise))
.ForMember(dst => dst.Status, opt => opt.MapFrom(src => src.Status))
.ForMember(dst => dst.TaxGroup, opt => opt.MapFrom(src => src.Taxes_Dflt))
.ForMember(dst => dst.Warehouse, opt => opt.MapFrom(src => src.Location))
.ForMember(dst => dst.CurrencyFactor, opt => opt.MapFrom(src => src.Dev_Fact))
.ForMember(dst => dst.Carrier, opt => opt.MapFrom(src => src.Exp_Tra))
.ForMember(dst => dst.BatchNumber, opt => opt.MapFrom(src => src.No_Lot))
.ForMember(dst => dst.IsPrinted, opt => opt.MapFrom(src => src.Imprime))
.ForMember(dst => dst.ShipToCustomerName, opt => opt.MapFrom(src => src.Exp_A2))
.ForMember(dst => dst.ShipToCustomerAddress, opt => opt.MapFrom(src => src.Exp_A3))
.ForMember(dst => dst.DiscountAvailable, opt => opt.MapFrom(src => src.DiscountAvailable))
.ForMember(dst => dst.DateDelivery, opt => opt.MapFrom(src => src.Date_Exp))
.ForMember(dst => dst.DiscountDate, opt => opt.MapFrom(src => src.DiscountDate))
.ForMember(dst => dst.ExportReferenceInAccountingSystem, opt => opt.MapFrom(src => src.CreditNoteAccpac))
.ForMember(dst => dst.ShipToProvinceCode, opt => opt.MapFrom(src => src.CIH_ShipToProvinceCode))
.ForMember(dst => dst.CurrentBalance, opt => opt.MapFrom(src => src.Montant))
.ForMember(dst => dst.CustomerOrder, opt => opt.MapFrom(src => src.No_Com))
.ForMember(dst => dst.ConfirmationDate, opt => opt.MapFrom(src => src.ConfirmationDate))
.ForMember(dst => dst.BillToProvinceCode, opt => opt.MapFrom(src => src.CIH_BillToProvinceCode))
.ForMember(dst => dst.BillToCustomerAddress, opt => opt.MapFrom(src => src.Fact_A3))
.ForMember(dst => dst.BilltoCustomerCity, opt => opt.MapFrom(src => src.Fact_A4))
.ForMember(dst => dst.BillToCustomerProvince, opt => opt.MapFrom(src => src.Fact_A5))
.ForMember(dst => dst.BillToCustomerZipCode, opt => opt.MapFrom(src => src.Fact_A6))
.ForMember(dst => dst.BillToCustomerName, opt => opt.MapFrom(src => src.Fact_A2))
.ForMember(dst => dst.LastUser, opt => opt.MapFrom(src => src.No_Usager))
.ForMember(dst => dst.BillToCustomer, opt => opt.MapFrom(src => src.Fact_A1))
.ForMember(dst => dst.Fob, opt => opt.MapFrom(src => src.Exp_Fab))
.ForMember(dst => dst.BillToContactFax, opt => opt.MapFrom(src => src.Faxcontact))
.ForMember(dst => dst.BillToContactPhone, opt => opt.MapFrom(src => src.Telcontact))
.ForMember(dst => dst.BillToContact, opt => opt.MapFrom(src => src.Contact))
.ForMember(dst => dst.BillOfLading, opt => opt.MapFrom(src => src.Waybill))
.ForMember(dst => dst.Note, opt => opt.MapFrom(src => src.Note_Entet))
.ForMember(dst => dst.PaymentTerm, opt => opt.MapFrom(src => src.Term))
.ForMember(dst => dst.IsContractExchangeRate, opt => opt.MapFrom(src => src.IsContractExchangeRate))
.ForMember(dst => dst.InvoiceType, opt => opt.MapFrom(src => src.InvoiceType))
.ForMember(dst => dst.Details, opt => opt.MapFrom(src => src.Fact2))
.ForMember(dst => dst.BillToCustomerCountry, opt => opt.MapFrom(src => src.CIH_BillToCountryCode))
.ForMember(dst => dst.ShipToCustomerCountry, opt => opt.MapFrom(src => src.CIH_ShipToCountryCode))
.ForMember(dst => dst.Code, opt => opt.MapFrom(src => src.No_Fact))
.ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.CIH_Id))
.AfterMap((src, dst) => dst.Details.ToList().ForEach(x => x.Header = dst));
}
}
}
The Where I am refering to in my test
public override IEnumerable<TOut> Where<TOut>(IEnumerable<Expression<Func<InvoiceHeader, bool>>> where, Expression<Func<InvoiceHeader, TOut>> select)
{
var query = this.Scope.Set<Fact>().ProjectTo<InvoiceHeader>(this.FieldMapper.ConfigurationProvider);
query = this.ApplyWhereConditions(query, where);
return query.Select(select).ToList();
}