Обновить запись с помощью AutoMapper, получить запись по LINQ - PullRequest
2 голосов
/ 14 февраля 2012

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

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());

Есть идеи?

Обновление 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; }
}

1 Ответ

4 голосов
/ 14 февраля 2012

Причина, по которой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...