C # Получить одинаковое имя объекта в той же иерархии Мыльный объект [duplicate]

7
задан Paul Aldred-Bann 31 October 2012 в 13:04
поделиться

3 ответа

.Attach () моя сопоставленная Entity и заданное состояние изменено?

public ActionResult EditEntity(EntityDto model)
{
    var entity = Mapper.Map<Entity>(model);
    context.Set<Entity>().Attach(entity); // (or context.Entity.Attach(entity);)
    context.Entry<Entity>(entity).State = System.Data.EntityState.Modified;
    context.SaveChanges();
    return View(model);
}

Где создается ваш контекст? Вы должны сделать это в своем действии EditEntity imo.

public ActionResult EditEntity(EntityDto model)
{
    using(var context = new MyContext())
    {
        var entity = Mapper.Map<Entity>(model);
        context.Set<Entity>().Attach(entity); // (or context.Entity.Attach(entity);)
        context.Entry<Entity>(entity).State = System.Data.EntityState.Modified;
        context.SaveChanges();
        return View(model);
    }
}
8
ответ дан Martin Mulder 21 August 2018 в 11:59
поделиться
  • 1
    Блестящий, это только что сработало. Дайте мне несколько моментов, чтобы попробовать в моем фактическом проекте. – Paul Aldred-Bann 31 October 2012 в 13:30
  • 2
    Это именно то, что я искал, еще раз спасибо! – Paul Aldred-Bann 31 October 2012 в 13:32
  • 3
    Рад, что я мог бы использовать альт-табу и скопировать пачку. Я имею в виду помощь. :) – Pluc 31 October 2012 в 13:34

Альтернативный ответ, который не требует Automapper для преобразования DTO в Entity, использует DbEntry:

        var oldEntity = DbSet.FirstOrDefault(x => x.Id == updatedEntity.Id);
        var oldEntry = Context.Entry(oldEntity);

        oldEntry.CurrentValues.SetValues(updatedEntity);

Вам не нужно проверять наличие / состояние, потому что вы получаете старую сущность сначала, так что к нему привязано отслеживание изменений. Кроме того, CurrentValues.SetValues ​​могут принимать разные типы, в этом примере updatedEntity является DTO. Документация по значениям значений объясняется следующим образом:

Устанавливает значения этого словаря, считывая значения из заданного объекта. Данный объект может быть любого типа. Любое свойство объекта с именем, которое соответствует имени свойства в словаре и может быть прочитано, будет считано. Другие свойства будут проигнорированы. Это позволяет, например, копировать свойства из простых объектов передачи данных (DTO).

Похоже, что он уже может работать в режиме autapper-esque.

1
ответ дан SventoryMang 21 August 2018 в 11:59
поделиться
  • 1
    Это полностью сработало для меня. Решение Mapper.Map (модель, сущность) не сработало для меня, потому что когда у вас есть вложенный объект, который вы обновляете (поэтому ваше свойство ссылается на другую (УЖЕ отслеживаемую) сущность сейчас), решение automapper будет «перезаписывать» ; ранее зарегистрированный объект, и changetracker будет жаловаться, что он уже отслеживает сущность с этим идентификатором. – nicolaas 19 June 2017 в 08:26

Попробуйте передать объект как второй параметр для вашего сопоставления.

entity = Mapper.Map<EntityDto, Entity>(model, entity);

В противном случае экземпляр вашего объекта перезаписывается новым экземпляром, и вы теряете объект, созданный в первой строке.

12
ответ дан xpda 21 August 2018 в 11:59
поделиться
  • 1
    К сожалению, я уже пробовал это, вызывает ту же проблему - в основном AutoMapper говорит, что он не может найти конфигурацию сопоставления, поскольку, когда я извлек свой Entity из контекста, это уже не просто ваш средний POCO, и поэтому AutoMapper не знает что делать. – Paul Aldred-Bann 31 October 2012 в 13:15
  • 2
    если в Entity есть другие свойства, которые вы не указали, вы можете также сказать, что AutoMapper игнорирует их: .ForMember (dest = & gt; dest.PropertyToIgnore, opt = & gt; opt.UseDestinationValue) – dark_ruby 31 October 2012 в 13:19
  • 3
    Это проблема, в то время, когда я создаю свои сопоставления AutoMapper Entity, это просто POCO, поэтому не содержит никакой дополнительной информации о сущности, которую создает EF при извлечении, поэтому я не могу сказать AutoMapper игнорировать их , – Paul Aldred-Bann 31 October 2012 в 13:23
  • 4
    но тогда объект, возвращенный в первой строке, не имеет тип Entity, наведите указатель мыши на «var» и посмотрите, какой тип он есть, и создайте сопоставление для этого типа. Кроме того, это второе отображение & lt; dto - & gt; лицо & GT; вам нужно, а не первое – dark_ruby 31 October 2012 в 13:25
  • 5
    Святой CRUD Я не знал, что вы можете сделать это с помощью Карты. Удивительно. – Worthy7 20 December 2016 в 06:18
Другие вопросы по тегам:

Похожие вопросы: