Обновление AutoMapper UseDestinationValue не работает должным образом для виртуальных свойств - PullRequest
0 голосов
/ 27 июня 2018

Пытается заставить AutoMapper (6.1.1) работать в этом сценарии при попытке обновить существующего поставщика и связанные контакты поставщика.

Я пытался использовать .ignore() и .UseDestinationValues() на связанных объектах, оба безрезультатно.

Вот что происходит с целевыми значениями после карты:

  1. существующиеStratusVendor.Id = 0 (должно быть значением существующих)
  2. существующиеStratusVendor.VendorContacts.Id = 0 (должно быть значением существующих)
  3. существующийStratusVendor.Items = null, но имел 1 связанный объект до сопоставления, то же самое со всеми другими связанными виртуальными свойствами. (это происходит для всех других виртуальных свойств, которые я также пометил как .UseDestinationValues())

Что я делаю не так или я неправильно понимаю, как это должно работать?

* 1021 POCO которые *

public partial class Vendor
{
    public Vendor()
    {
        this.Items = new HashSet<Item>();
        this.Items1 = new HashSet<Item>();
        this.VendorContacts = new HashSet<VendorContact>();
        this.POHeaders = new HashSet<POHeader>();
        this.ReceiptHeaders = new HashSet<ReceiptHeader>();
        this.ItemPriceCostRules = new HashSet<ItemPriceCostRule>();
    }

    public int Id { get; set; }
    public int CompanyId { get; set; }
    public string VendorName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string Notes { get; set; }
    public int CreatedById { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public int ModifiedById { get; set; }
    public System.DateTime ModifiedOn { get; set; }
    public string FinancialsId { get; set; }
    public int LeadTimeDays { get; set; }
    public int SafetyStockDays { get; set; }

    public virtual ICollection<Item> Items { get; set; }
    public virtual ICollection<Item> Items1 { get; set; }
    public virtual ICollection<VendorContact> VendorContacts { get; set; }
    public virtual ICollection<POHeader> POHeaders { get; set; }
    public virtual Company Company { get; set; }
    public virtual UserProfile UserProfile { get; set; }
    public virtual UserProfile UserProfile1 { get; set; }
    public virtual ICollection<ReceiptHeader> ReceiptHeaders { get; set; }
    public virtual ICollection<ItemPriceCostRule> ItemPriceCostRules { get; set; }
}

public partial class VendorContact
{
    public int Id { get; set; }
    public int VendorId { get; set; }
    public string ContactName { get; set; }
    public string EmailAddress { get; set; }
    public string OfficePhone { get; set; }
    public string CellPhone { get; set; }
    public int CreatedById { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public int ModifiedById { get; set; }
    public System.DateTime ModifiedOn { get; set; }
    public bool PurchasingContact { get; set; }

    public virtual Vendor Vendor { get; set; }
    public virtual UserProfile UserProfile { get; set; }
    public virtual UserProfile UserProfile1 { get; set; }
}

Карты

CreateMap<Vendor, Vendor>()
    .ForMember(dest => dest.Id, option => option.UseDestinationValue())                  
    .ForMember(dest => dest.Company, option => option.UseDestinationValue())
    .ForMember(dest => dest.POHeaders, option => option.UseDestinationValue())
    .ForMember(dest => dest.ReceiptHeaders, option => option.UseDestinationValue())                
    .ForMember(dest => dest.Items, option => option.UseDestinationValue())
    .ForMember(dest => dest.Items1, option => option.UseDestinationValue())
    .ForMember(dest => dest.ItemPriceCostRules, option => option.UseDestinationValue())
    .ForMember(dest => dest.UserProfile, option => option.UseDestinationValue())
    .ForMember(dest => dest.UserProfile1, option => option.UseDestinationValue())
    ;

CreateMap<VendorContact, VendorContact>()
    .ForMember(dest => dest.Id, option => option.UseDestinationValue())
    .ForMember(dest => dest.VendorId, option => option.UseDestinationValue())
    .ForMember(dest => dest.UserProfile, option => option.UseDestinationValue())
    .ForMember(dest => dest.UserProfile1, option => option.UseDestinationValue())

Код

public ActionConfirmation<int> ImportFromFinancials(Vendor financialsModifiedVendor, int intUserId)
{    
Vendor vendorToUpdate;

var existingStratusVendor = _vendorRepository
    .SearchFor(a => a.CompanyId == intCompanyId && a.FinancialsId == financialsModifiedVendor.FinancialsId).FirstOrDefault();

if (existingStratusVendor == null) //add a new vendor
{
    vendorToUpdate = financialsModifiedVendor;
}
else
{    
    Mapper.Map(financialsModifiedVendor, existingStratusVendor);   
    vendorToUpdate = existingStratusVendor;
}

//Save Vendor
var baseAppServ = new BaseAppServ<Vendor>(_repository);
var vendorUpdateResult = baseAppServ.SaveOrUpdate(vendorToUpdate, intUserId);

if (!vendorUpdateResult.WasSuccessful) return vendorUpdateResult;
...
}

1 Ответ

0 голосов
/ 27 июня 2018

обе сущности имеют одинаковые имена, похоже, вам не хватает пространства имен

CreateMap<Other.Namespace.VendorContact, VendorContact>()
.ForMember(dest => dest.Id, option => option.UseDestinationValue())
.ForMember(dest => dest.VendorId, option => option.UseDestinationValue())
.ForMember(dest => dest.UserProfile, option => option.UseDestinationValue())
.ForMember(dest => dest.UserProfile1, option => option.UseDestinationValue())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...