Как обновить / изменить поле базы данных с помощью Entity Framework и Mapper - PullRequest
0 голосов
/ 12 января 2012

Это конкретный вопрос. Мы кодируем сервис wcf с использованием C #, EF4.1 и Mapper. Мы не хотим использовать хранимые процедуры ... Во всяком случае; Проблема в том, что мы хотим отредактировать поле адреса на БД. Но мы не можем сохранить отредактированный адрес в БД.

    public int EditAddress(int userId, Address address)
    {
        using(var mobileServiceContext = new MobileServiceContext())
        {
            Address oldAddress = mobileServiceContext.Addresses.FirstOrDefault(p => p.UserId == userId && p.AddressId == address.AddressId);
            Address lastAddress = Mapper.Map(address, oldAddress);

            //save new-last address with ? HOW ?
            //mobileServiceContext.Addresses.Attach(updatedAddress); //doesn't work
            mobileServiceContext.SaveChanges();
        }

        return address.AddressId;
    }

Вот наша отредактированная функция;

    public int EditAddress(int userId, Address address)
    {
        using(var mobileServiceContext = new MobileServiceContext())
        {
            Address oldAddress = mobileServiceContext.Addresses.FirstOrDefault(p => p.UserId == userId && p.AddressId == address.AddressId);
            Address lastAddress = Mapper.Map(address, oldAddress);

            mobileServiceContext.Addresses.Attach(lastAddress); //error on this line
            mobileServiceContext.ObjectStateManager.ChangeObjectState(lastAddress, EntityState.Modified);
            mobileServiceContext.SaveChanges();
        }

        return address.AddressId;
    }

Примечание: класс «Адресный адрес» уже имеет адрес. Поле идентификатора.

Это очень сложный дизайн, который мы сделали здесь, и его трудно читать читателю.

1 Ответ

0 голосов
/ 12 января 2012

Вместо использования AutoMapper в этом сценарии вы можете сделать следующее:

//this assumes that the AddressId in address is exists in the database: just attach it to the addresses set
mobileServiceContext.Addresses.Attach(address);
//this tells ef that the object is in a modified state
mobileServiceContext.ObjectStateManager.ChangeObjectState(address, entityState.Modified);
//savechanges will now update the database
mobileServiceContext.SaveChanges();

Я не вижу здесь необходимости в AutoMapper или какой-либо утилите сопоставления, поскольку мы не сопоставляем модель данных смодель представления (или что-то в этом роде).

...