2012-02-14 3 views
2

Когда я выполнить код, приведенный ниже, в адресе на Mapper.Map линии это нормально у меня есть правильные значения, поступающие от модели, но customer.Address, в ISet коллекции, не обновляется на session.Save(customer) линии , Должно быть обновлено с address является ссылкой.Update запись с AutoMapper, запись както LINQ

public ActionResult SaveAddressInvoice(CustomerAddressForView model) 
{ 
    var tx = session.BeginTransaction(); 

    var customer = session.Get<Customer>(customerId); 
    var address = customer.Address.Where(x => x.Id == myAddressId).First<CustomerAddress>(); 

    address = Mapper.Map<CustomerAddressForView, CustomerAddress>(model); 

    session.Save(customer); 
    tx.Commit(); 
} 

Если я:

var address = customer.Address.Where(x => x.Id == myAddressId).First<CustomerAddress>(); 
address.Street = "MyStreet"; 

Я вижу запись изменилась в коллекции.

Отображение конфигурации:

Mapper.CreateMap<CustomerAddressForView, CustomerAddress>() 
    .ForMember(x => x.Id, opt => opt.Ignore()); 

Любая идея?

Update 1

public class Customer 
{ 
    public virtual int Id { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual Iesi.Collections.Generic.ISet<CustomerAddress> Address { get; set; } 

    public Customer() 
    { 
     Address = new Iesi.Collections.Generic.HashedSet<CustomerAddress>(); 
    } 
} 

public class CustomerAddress 
{ 
    public virtual int Id { get; set; } 
    public virtual string Street { get; set; } 
    public virtual Customer Customer { get; set; } 
} 
+0

Что случилось с этим: 'вар адрес = customer.Address.Single (х => x.Id == myAddressId); '? – gdoron

+0

Возможно, вам потребуется включить соответствующие части классов «CustomerAddressForView» и «CustomerAddress». – R0MANARMY

+0

@gdoron ничего, я получаю правильное значение из коллекции. Когда я обновляю значение, полученное с помощью Automapper, коллекция не обновляется. Когда я обновляю поле значения get из коллекции, коллекция обновляется –

ответ

4

Причина NHibernate не обновляя CustomerAddress объект, на который ссылается customer.Addresses потому, что address переменная перезаписывается с новым объектом в вызове метода Mapper.Map:

address = Mapper.Map<CustomerAddressForView, CustomerAddress>(model); 

AutoMapper создает новыйCustomerAddress объект, который не связан с полученным Customer, поэтому ничто не обновляется, когда вы вызываете session.Save().

Вы должны передать ссылку с извлеченной CustomerAddress объекта AutoMapper, чтобы обновить свои свойства:

var address = customer.Address 
    .Where(x => x.Id == myAddressId) 
    .First<CustomerAddress>(); 
Mapper.Map(model, address); // Updates the existing address 
Смежные вопросы